標頭檔class C++繼承和函數重寫




c++標頭檔class (3)

在C ++中,基類的成員函數是否會被其相同名稱的派生類函數覆蓋, 即使它的原型(參數'count,type和constness)不同 ? 我想這是一個愚蠢的問題,因為很多網站都說功能原型應該是相同的。 但為什麼下面的代碼不能編譯? 我相信這是一個非常簡單的繼承案例。

#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;
}

海灣合作委員會拋出

error: no matching function for call to `Y::spray(A&)'
note: candidates are: void Y::spray(B&)

Answer #1

類是范圍,類範圍嵌套在其父級中。 您與其他嵌套作用域(名稱空間,塊)具有完全相同的行為。

會發生什麼事情,當名稱查找搜索名稱的定義時,它會查找當前名稱空間,然後查看englobing名稱空間,依此類推,直到找到一個定義; 搜索然後停止(這沒有考慮參數依賴名稱查找引入的複雜性 - 規則的一部分允許使用在其參數之一的命名空間中定義的函數)。


Answer #2

這就是所謂的'隱藏': Y::spray隱藏X::spray 。 添加using指令:

class Y : public X
{
public:
   using X::spray;
   // ...
};

Answer #3

用於描述這一術語的術語是“隱藏”,而不是“覆蓋”。 默認情況下,派生類的成員將使具有相同名稱的基類的任何成員都不可訪問,無論它們是否具有相同的簽名。 如果要訪問基類成員,可以using聲明將它們拉入派生類。 在這種情況下,將以下內容添加到class Y

using X::spray;




function-overriding