C++學習筆記 —— 繼承同名變數於多重繼承
阿新 • • 發佈:2020-12-14
繼承同名變數解析
如果子類只是繼承父類的變數,則在子類中該變數其實只有一個,他的名字可以叫 d.A::n d.B::n 或 d.n,他們三個都是一個人
class A
{
public:
int n;
};
class B: public A {};
class D: public B {};
int main()
{
D d;
d.A::n = 10;
d.B::n = 20;
d.n = 30;
cout<< d.n << ", " << d.B::n << ", " << d.n<< endl; //30,30,30
}
如果子類中重新定義了父類繼承來的變數,那麼子類中其實存在父類變數,也就是如下中D中存在三個變數,分別對應三個值
class A
{
public:
int n;
};
class B: public A {
public:
int n;
};
class D: public B {
public:
int n;
};
int main()
{
D d;
d.A:: n = 10;
d.B::n = 20;
d.n = 30;
cout<< d.A::n << ", "<< d.B::n << ", " << d.n<< endl;//10,20,30
}
函式繼承同上
多重繼承問題
子類繼承父類變數,多重繼承
class A
{
public:
int n;
};
class B: public A {};
class C: public A {};
class D: public B ,public C{ };
int main()
{
D d;
//d.n = 1;//直接拿n會報錯,因為這裡存在二義性,不知道是從B拿來的還是從C拿來的
//d.A::n = 4; //這裡會報錯,因為是多重繼承,所以這裡的A會產生歧義,不知道是從B拿來的A還是從C拿來的A
d.B::n = 10; //這裡就可以,因為明確說明n
d.C::n = 20;
}
使用虛基類解決多繼承問題
class A
{
public:
int n;
};
class B: virtual public A {};
class C: virtual public A {};
class D: public B ,public C{ };
int main()
{
D d;
//d.n = 1; //可以拿到
//d.A::n = 4; //可以拿到,只有一個n
d.B::n = 10;
d.C::n = 20;
cout << d.A::n;
}
它的被繼承成員在派生類中只保留一個例項。從類 D這個角度上來看,它是從類B與類C繼承過來的,而類B C又是從類A繼承過來的,
但它們只保留一個副本。因此在子類中實際只有唯一的該變數
所以設計類時避免多重繼承