1. 程式人生 > >C++ 類(多繼承和虛繼承)

C++ 類(多繼承和虛繼承)

文章概述
      1. 多繼承的定義以及多繼承的語法;
      2. 虛繼承;


多繼承的定義以及多繼承的語法
a. 一個類有多個基類,這樣的繼承關係稱為多繼承; 
b. 多繼承宣告語法:

class 派生類名: 訪問控制符 基類名1,訪問控制符 基類名2 

資料成員和成員函式宣告; 
}

class A: public B,public c
{
}

圖示: 

è¿éåå¾çæè¿°
 
c. 多個直接基類建構函式執行順序取決於定義派生類時指定的各個繼承基類的順序。

虛繼承
產生二義性 ?
class A
{
public:
    int x;
};

class B: public A
{
    int b;
public:
    B(int x)
    {
        this->x = 10;
    }
};

class C : public A
{
    int c;
public:
    C(int x)
    {
        this->x = 20;
    }
};

class D :public B,public C
{
    int d;
public:
    D(int x):B(10),C(20)
    {
        //對於D中的x,到底是從哪個類(B,C)中繼承的,不明確,會產生二義性。
        this->x = 30;
    }
};

對於產生二義性的原因分析在於分析d的物件模型: 

è¿éåå¾çæè¿°
 
其實,產生二義性的原因就在於A的建構函式在c中呼叫了兩次,不知道x是哪個物件的。如果要讓A在c中只產生一個物件,則應該對公共基類A宣告為虛繼承,使得這個公共基類成為虛基類。 
2. 在c中只產生一個公共基類的物件

//當類中出現virtual時,C++編譯器會物件新增一個vptr指標,同時會產生一個虛擬函式表
class A
{
public:
    int x;  //4
public:
    A()
    {
        cout << "A" << endl;
    }
};

class B:virtual  public A
{
    int b; //4
public:
    B(int x)
    {
        this->x = 10;
        cout << "B" << endl;
    }
};

class C :virtual public A
{
    int c; //4
public:
    C(int x)
    {
        this->x = 20;
        cout << "C" << endl;
    }
};

class D :public B,public C
{
    int d; //4 
public:
    D(int x):B(10),C(20)
    {
        this->x = 30;
        cout << "D" << endl;
    }
};

int main()
{
    cout << sizeof(A) << endl;   //4
    cout << sizeof(B) << endl;   //12
    cout << sizeof(C) << endl;   //12
    cout << sizeof(D) << endl;   //24
    return 0;
}

分析d的物件模型: 

è¿éåå¾çæè¿°
 
C++提供虛繼承機制,防止類繼承關係中成員訪問的二義性。