[英]C++ inheritance and function overriding
在C ++中, 即使原型(參數的數量,類型和常量)不同,基類的成員函數也會被同名的派生類函數覆蓋嗎? 我猜這是一個愚蠢的問題,因為許多網站都說功能原型應該是相同的。 但是為什么下面的代碼不能編譯? 我認為,這是一個非常簡單的繼承案例。
#include <iostream>
using std::cout;
using std::endl;
class A {};
class B {};
class X
{
public:
void spray(A&)
{
cout << "Class A" << endl;
}
};
class Y : public X
{
public:
void spray(B&)
{
cout << "Class B" << endl;
}
};
int main()
{
A a;
B b;
Y y;
y.spray(a);
y.spray(b);
return 0;
}
GCC拋出
error: no matching function for call to `Y::spray(A&)'
note: candidates are: void Y::spray(B&)
用於描述此內容的術語是“隱藏”,而不是“覆蓋”。 默認情況下,派生類的成員將使具有相同名稱的基類的任何成員均不可訪問,無論它們是否具有相同的簽名。 如果要訪問基類成員,則可以using
聲明將它們拉入派生類。 在這種情況下,將以下內容添加到class Y
:
using X::spray;
所謂的“隱藏”: Y::spray
隱藏X::spray
。 使用指令添加:
class Y : public X
{
public:
using X::spray;
// ...
};
類是范圍,類范圍嵌套在其父級中。 您與其他嵌套作用域(命名空間,塊)具有完全相同的行為。
發生的事情是,當名稱查找搜索名稱的定義時,它將在當前名稱空間中查找,然后在包含名稱空間的名稱中查找,依此類推,直到找到一個定義; 然后搜索就停止了(這沒有考慮參數依賴名稱查找所帶來的復雜性-規則的一部分,該規則允許使用在其參數之一的名稱空間中定義的函數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.