簡體   English   中英

C ++繼承和功能覆蓋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM