虚继承c语言例子,C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}
C/C++:一個基類繼承和多個基類繼承的區別
1.對多個基類繼承會出現類之間嵌套時出現的同名問題,如果同名變量或者函數出現不在同一層次,則底層派生隱藏外層比如繼承基類的同名變量和函數,不會出現二義性,而如果出現在同一階層,?則會 出現二義性,解決辦法:要么在同一階層的底層(派生類)中重新定義可以解決,或者使用虛基類(減少部分二義性)
2.虛基類:在派生列表中使用virtual關鍵字的基類(即使這部分虛基類在繼承中多次出現,但只初始化一份) ?虛繼承:虛基類將被 "最底層派生類"(任何虛基類以下派生類都可能是最底層派生類,所以都應該提供虛基類的初始值(即構造虛基類))初始化,因此最底層派生類應該含有它所有虛基類的初始值(即構造虛基類)
3.虛基類保證多次繼承相同基類但只有一份基類數據(保證共享);
4.虛繼承的構造順序由編譯器按照派生類列表從左往右尋找虛基類函數,先構造虛基類部分,然后按照正常構造從左到右構造,最后構造本身,而析構相反
5.派生類的合成拷貝和構造,賦值都是按照上述規則執行,所以手動寫拷貝,構造,和賦值時,需要按照這個順序構造
6.所以虛繼承出現在虛基類之后(個人理解)
C/C++代碼:
#include
#include
class Class
{
};
class Base : public Class
{
protected:
int value;
public:
Base() : value(0)
{};
Base(const Base &rhs) : Class(), value(rhs.value)
{};
Base(int a) : value(a), Class()
{};
};
class D1 : virtual public Base
{
public:
D1() : Base()
{};
D1(int a) : Base(a)
{};
D1(const D1 &rhs) : Base(rhs)
{};
};
class D2 : virtual public Base
{
public:
D2() : Base()
{};
D2(int a) : Base(a)
{};
D2(const D2 &rhs) : Base(rhs)
{};
};
class MI : public D1, public D2
{
public:
MI() : D1(), D2()
{}
MI(int a) : Base(a), D1(a), D2(a)
{};
MI(const MI &rhs) : Base(rhs), D1(rhs), D2(rhs)
{};
};
class Final : public MI, public Class
{
public:
using Base::value;
Final()
{};
Final(int a) : Base(a), MI(a), Class()
{};
Final(const Final &rhs) : Base(rhs), MI(rhs), Class()
{};
};
int main()
{
Final A(20);
std::cout << A.value << std::endl;
return 0;
}
總結
以上是生活随笔為你收集整理的虚继承c语言例子,C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言吧百度贴吧经典100例,C语言程序
- 下一篇: c 语言与试验系统,C/C++程序设计学