菱形繼承 2

2021-08-20 03:09:41 字數 4006 閱讀 1235

如果inheritclass_1和inheritclass_2都是虛繼承baseclass,然後被inheritclass_3繼承(非虛繼承)這樣就能解決二義性問題。如果inheritclass_1或inheritclass_2只有乙個虛繼承baseclass,另乙個為普通繼承,然後被inheritclass_3繼承(非虛繼承),只有又會這樣呢?**如下:

#include "iostream"

using

namespace

std;

class baseclass

virtual

void virt_fun2()

void comm_fun1()

void comm_fun2()

baseclass()

~baseclass()

};class inheritclass_1 : public

virtual baseclass

virtual

void virt_fun3()

inheritclass_1()

~inheritclass_1()

};class inheritclass_2 : public baseclass

virtual

void virt_fun3()

inheritclass_2()

~inheritclass_2()

};class inheritclass_3 : public inheritclass_1, public inheritclass_2

virtual

void virt_fun2()

virtual

void virt_fun3()

inheritclass_3()

~inheritclass_3()

};int _tmain(int argc, _tchar* argv)

依舊存在二義性,程式執行結果如下:

inheritclass_3占用48位元組記憶體,記憶體分布如下:

1:由於inheritclass_1為虛繼承,所以inheritclass_1的baseclass位於記憶體最高位

2:由於inheritclass_2為普通繼承,所以inheritclass_2的baseclass位於記憶體低位

3:由於inheritclass_3同時繼承於inheritclass_1和inheritclass_2,所以inheritclass_3記憶體分布如上

如果inheritclass_1和inheritclass_2都是虛繼承baseclass,然後被inheritclass_3繼承(非虛繼承)這樣就能解決二義性問題。如果inheritclass_1和inheritclass_2都是虛繼承baseclass,然後被inheritclass_3同時虛繼承,又會如何?

#include "iostream"

using

namespace

std;

class baseclass

virtual

void virt_fun2()

void comm_fun1()

void comm_fun2()

baseclass()

~baseclass()

};class inheritclass_1 : public

virtual baseclass

virtual

void virt_fun3()

inheritclass_1()

~inheritclass_1()

};class inheritclass_2 : public

virtual baseclass

virtual

void virt_fun3()

inheritclass_2()

~inheritclass_2()

};class inheritclass_3 : public

virtual inheritclass_1, public

virtual inheritclass_2

virtual

void virt_fun2()

virtual

void virt_fun3()

inheritclass_3()

~inheritclass_3()

};int _tmain(int argc, _tchar* argv)

此時也沒有問題,程式執行結果如下:

inheritclass_3占用56位元組記憶體,記憶體分布如下:

從記憶體分布看:

1:由於inheritclass_3虛繼承inheritclass_1和inheritclass_2,所以inheritclass_3的成員位於最低位址處

2:疑問,為何baseclass的位址低於inheritclass_1和inheritclass_2呢?

如果inheritclass_1和inheritclass_2都是虛繼承baseclass,然後被inheritclass_3虛繼承其中乙個,又會怎樣呢?

#include "iostream"

using

namespace

std;

class baseclass

virtual

void virt_fun2()

void comm_fun1()

void comm_fun2()

baseclass()

~baseclass()

};class inheritclass_1 : public

virtual baseclass

virtual

void virt_fun3()

inheritclass_1()

~inheritclass_1()

};class inheritclass_2 : public

virtual baseclass

virtual

void virt_fun3()

inheritclass_2()

~inheritclass_2()

};class inheritclass_3 : public

virtual inheritclass_1, public inheritclass_2

virtual

void virt_fun2()

virtual

void virt_fun3()

inheritclass_3()

~inheritclass_3()

};int _tmain(int argc, _tchar* argv)

依舊沒有問題,程式執行如下:

inheritclass_3占用48位元組記憶體,記憶體分布如下:

從記憶體分布可以看出:

1:非虛繼(inheritclass_2)的位址低於虛繼承(inheritclass_1)的位址

2:非虛繼承與虛繼承同時存在時,派生類的成員(inheritclass_3)位於最高位(非虛繼承導致)

菱形繼承 菱形虛擬繼承

菱形繼承 鑽石繼承 模型 拿如下 舉例 class person class student public person class teacher public person class graduate public student,public teacher void test 當派生類gr...

菱形繼承和菱形虛繼承

繼承是c 的一大特點,我們通過菱形繼承和菱形虛繼承對繼承進行進一步的分析。菱形繼承 建立乙個基類a讓b1和b2公有繼承於它,讓c公有繼承b1和b2。class a a int a class b1 public a b1 int b1 class b2 public a b2 int b2 clas...

多重繼承(菱形繼承)

多重繼承 經典的是菱形繼承,如圖。菱形繼承將會產生的問題 把基類a中的成員變數通過b和c兩次繼承至d。d的繼承結構 可以看到,ma被繼承兩次至d 那麼將如何解決這個問題呢?採用虛繼承的方法,將基類a中的ma直接繼承至d。如下 class a int ma class b virtual public...