單繼承是一般的單一繼承,一個(gè)子類只 有一個(gè)直接父類時(shí)稱這個(gè)繼承關(guān)系為單繼承。這種關(guān)系比較簡(jiǎn)單是一對(duì)一的關(guān)系:iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 

多繼承是指 一個(gè)子類有兩個(gè)或以上直接父類時(shí)稱這個(gè)繼承關(guān)系為多繼承。這種繼承方式使一個(gè)子類可以繼承多個(gè)父類的特性。多繼承可以看作是單繼承的擴(kuò)展。派生類具有多個(gè)基類,派生類與每個(gè)基類之間的關(guān)系仍可看作是一個(gè)單繼承。多繼承下派生類的構(gòu)造函數(shù)與單繼承下派生類構(gòu)造函數(shù)相似,它必須同時(shí)負(fù)責(zé)該派生類所有基類構(gòu)造函數(shù)的調(diào)用。同時(shí),派生類的參數(shù)個(gè)數(shù)必須包含完成所有基類初始化所需的參數(shù)個(gè)數(shù)。在子類的內(nèi)存中它們是按照聲明定義的順序存放的,下面的截圖將清晰看到。
iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

菱形繼承也叫鉆石繼承iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 

但是多繼承存在一個(gè)問題,要想研究這個(gè)問題,我們先從單繼承講起。來(lái)看內(nèi)存空間:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 1 class Base 2 { 3 public: 4 Base() { 5 cout << "B()" << endl; 6 } 7 int b1; 8 }; 9 class Derive : public Base10 {11 public:12 Derive() {13 cout << "D()" << endl;14 }15 int d1; 
16 };17 int main()18 {19 Test();20 getchar();21 return 0;22 }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

多繼承的內(nèi)存空間:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 1 class Base 2 { 3 public: 4 Base() { 5 cout << "B()" << endl; 6 } 7 int b1; 8 }; 9 class C10 {11 public:12 C() {13 cout << "C()" << endl;14 }15 int c;16 };17 class Derive : public Base, public C18 {19 public:20 Derive() {21 cout << "D()" << endl;22 }23 int d1; 
24 };

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

菱形繼承內(nèi)存中數(shù)據(jù)分布:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 1 class A 2 { 3 public: 4 A() { 5 cout << "A()" << endl; 6 } 7 int a; 8 }; 9 class Base:public A10 {11 public:12 Base() {13 cout << "B()" << endl;14 }15 int b1;16 };17 class C: public A18 {19 public:20 C() {21 cout << "C()" << endl;22 }23 int c;24 };25 class Derive : public Base, public C26 {27 public:28 Derive() {29 cout << "D()" << endl;30 }31 int d1; 
32 };

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)在A類中初始化int a=4則可清楚的看到菱形繼承中內(nèi)存分布iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)所以子類Derive中有兩份A類中的數(shù)據(jù)成員,這造成了訪問二義性和數(shù)據(jù)冗余的問題iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)這就是我前面說(shuō)的多繼承存在的問題。可以這樣訪問

1 tmp.C::a=4;2 tmp.Base::a=5;

什么是對(duì)象模型

有兩個(gè)概念可以解釋C++對(duì)象模型:

1、語(yǔ)言中直接支持面向?qū)ο蟪绦蛟O(shè)計(jì)的部分。
2、對(duì)于各種支持的底層實(shí)現(xiàn)機(jī)制。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

還有另外一個(gè)方法解決這個(gè)問題,我們要用到一種新的繼承方法:虛繼承--解決菱形繼承的二義性和數(shù)據(jù)冗余的問題??聪旅孢@段代碼:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 1 class Base 2 { 3 public: 4     Base() { 5         cout << "B()" << endl; 6     } 7     int b1; 8 }; 9 class Derive : virtual public Base10 {11 public:12     Derive() {13         cout << "D()" << endl;14     }15     int d1; 
16 };17 void Test()18 {19     Derive tmp;20     tmp.d1 = 1;21     tmp.b1 = 2;23 }24 int main()25 {26     Test();27     getchar();28     return 0;29 }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

虛擬繼承的關(guān)鍵字---virtualiOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 1 class A 2 { 3 public: 4     A() { 5         cout << "A()" << endl; 6     } 7     int a ; 8 }; 9 class Base : virtual public A10 {11 public:12     Base() {13         cout << "B()" << endl;14     }15     int b1;16 };17 class C:virtual public A18 { 
19 public:20     C() {21         cout << "C()" << endl;22     }23     int c;24 };25 class Derive : virtual public Base, virtual public C26 {27 public:28     Derive() {29         cout << "D()" << endl;30     }31     int d1; 
32 };33 void Test()34 {35     Derive tmp;36     tmp.d1 = 1;37     tmp.b1 = 2;38     tmp.c = 3;39     tmp.a = 4;40 }41 int main()42 {43     Test();44     getchar();45     return 0;46 }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

菱形虛擬繼承的對(duì)象模型iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)解決二義性問題在vs環(huán)境下用的是偏移量,而不是圖中的直接指針指向這里只是為了更直觀的展示。

http://www.cnblogs.com/33debug/p/6718672.html