簡體   English   中英

對C ++繼承感到困惑

[英]Confused about C++ inheritance

程式碼片段:

class A
{
    protected:
    int b;
};

class B : public A
{

};

struct C : B
{
    int call (const C&);
};

class D : B
{
    int call (const C&);
};

int C::call (const C& c)
{
    return c.b;
}

int D::call (const C& c)
{
    return c.b;
}

int main (void)
{
    return 0;
}

為什么可以在C::call()訪問cb但不能在D::call()訪問cb

他們不一樣嗎? 兩者都是從外部引用的!

這是GCC編譯器給出的錯誤消息:

main.cpp: In member function 'int D::call(const C&)':
main.cpp:4:9: error: 'int A::b' is protected
     int b;
         ^
main.cpp:29:14: error: within this context
     return c.b;
              ^

您的繼承樹如下: 在此處輸入圖片說明

所以C是B,它本身就是A。由於b受保護,C和B可以訪問它們從A繼承的b。

同樣,D是一個B,它本身就是A。因此D和B可以訪問它們從A繼承的b。

但是C和D沒有直接關系。 他們就像陌生人一樣。 因此,C無法從D看到b,而D也無法從C看到b。

查看您的代碼:

首先,在下面的代碼中,您不返回對象的b成員。 您返回另一個C對象的b作為參數傳遞:

int C::call (const C& c)
{
    return c.b;
}

關於此細節,C的任何成員函數都可以訪問任何C對象的所有成員。 因此,此函數是有效的C ++代碼。

下一個功能不能正常工作:

int D::call (const C& c)
{
    return c.b;
}

傳遞給D的此成員函數的參數屬於C類。如上所述,C和D沒有直接關系。 因此,C對象就像D的成員函數的黑匣子。因此,該函數只能訪問C的公共成員。

這就是為什么您收到此錯誤消息的原因:D對象無權訪問C對象的受保護成員或私有成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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