1. 程式人生 > 其它 >C++學習筆記 —— 繼承同名變數於多重繼承

C++學習筆記 —— 繼承同名變數於多重繼承

技術標籤:C++學習筆記c++

繼承同名變數解析

如果子類只是繼承父類的變數,則在子類中該變數其實只有一個,他的名字可以叫 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繼承過來的,
但它們只保留一個副本。因此在子類中實際只有唯一的該變數

所以設計類時避免多重繼承