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