如果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...