多繼承的構造和析構函數調用順序


聲明多繼承的方法

多繼承與單繼承的區別僅在於它們基類的個數。在定義多繼承的派生類時,要指出它們所有基類名以及繼承方式。

聲明形式如下:

class 派生類名:繼承方式1 基類名1,繼承方式2,基類名2,......,繼承方式n,基類名n

  派生類新增成員;

};

注意:每一個“繼承方式”只限定緊隨其后的基類。

多繼承派生類的構造函數

多繼承下派生類的構造函數與單繼承下派生類構造函數相似,其格式為:

派生類名 (總參數表):基類名1(參數表),......,基類名n(參數表),

     子對象1(參數表),......,子對象名n(參數表)

  派生類中新增數據結構成員初始化語句;

};

其中,(總參數表)中包含了其后的各個分參數表。

派生類構造函數執行的一般次序如下:

①調用基類構造函數,調用順序按照它們被繼承時說明的順序(上文中聲明多繼承基類時的順序,綠色部分)(從左到右)。

②調用子對象的構造函數,調用順序按照它們在類中說明的順序(多繼承時聲明子對象時的順序)(從上到下)。

③執行派生類構造函數體中的內容。

注意:這些構造函數的執行順序和派生類構造函數中列出的名稱順序毫無關系(即和上文中紅色部分毫無關系)。

多繼承派生類的析構函數

與單繼承的析構函數相似,派生類是否需要析構函數僅與其自身的需要有關,與基類的析構函數無關。析構函數的調用順序與上面介紹的構造函數的調用順序相反。

下面是一個多繼承派生類的構造函數和析構函數的例子:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class Base1
 5 {
 6     public:
 7         Base1(int x)
 8             {cout<<"基類1構造函數"<<"X1= "<<x<<endl;}
 9         ~Base1()
10             {cout<<"基類1析構函數"<<endl; }
11 };
12 class Base2
13 {
14     public:
15         Base2(int x)
16             {cout<<"基類2構造函數"<<"X2= "<<x<<endl;}
17         ~Base2()
18             {cout<<"基類2析構函數"<<endl; }
19 };
20 class Base3
21 {
22     public:
23         Base3()
24             {cout<<"基類3構造函數"<<endl;}
25         ~Base3()
26             {cout<<"基類3析構函數"<<endl; }
27 };
28 
29 class A:public Base2,public Base3,public Base1
30 {
31     public:
32         A(int a,int b,int c,int d)
33             :Base1(a),Base2(b),m1(c),m3(),m2(d)
34             //此處如果基類構造函數沒有參數,則可省略
35             //基類和子函數的陳列,且順序隨意 
36             //or:Base1(a),Base2(b),m1(c),m2(d)
37         {
38             cout<<"派生類構造函數"<<endl;
39         }
40         ~A()
41         {
42             cout<<"派生類析構函數"<<endl;
43         }
44     private:
45     Base1 m1;
46     Base2 m2;
47     Base3 m3; 
48 };
49 
50 int main()
51 {
52     A obj(1,2,3,4);
53     return 0;
54 }

實現效果如下:

關於單繼承問題請跳轉至http://www.cnblogs.com/tenjl-exv/articles/7624253.html

v、


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM