#include <iostream>
using namespace std;
class Grand
{
public:
Grand(int i) :m_valuegrand(i)
{
cout << "调用了Grand构造函数"<< endl;
}
virtual ~Grand()
{
cout << "调用了Grand析构函数"<< endl;
}
void mymind()
{
cout << m_valuegrand << endl;
}
public:
int m_valuegrand;
public:
};
//定义父类A
//class A :public Grand
class A :virtual public Grand //虚继承
{
public:
A(int i) :Grand(i), m_valuea(i) //每个子类的构造函数负责,负责解决自己的初始化问题。
{
cout << "调用了类A构造函数"<< endl;
}
virtual ~A()
{
cout << "调用了类A析构函数"<< endl;
}
void myinfo()
{
cout << m_valuea << endl;
}
public:
int m_valuea;
};
//定义父类A2
//class A2:public Grand
class A2:virtual public Grand
{
public:
A2(int i) :Grand(i), m_valuea2(i) //这里的Grand已经没作用了
{
cout << "调用了类A2构造函数"<< endl;
}
virtual ~A2()
{
cout << "调用了类A2析构函数"<< endl;
}
void myinfo()
{
cout << m_valuea2 << endl;
}
public:
int m_valuea2;
};
//定义父类B
class B
{
public:
B(int i) : m_valueb(i)
{
cout << "调用了B构造函数"<< endl;
}
B(){
cout << "B的默认构造函数"<<endl;
}
virtual ~B()
{
cout << "调用了B析构函数"<< endl;
}
void myinfo()
{
cout << m_valueb << endl;
}
public:
int m_valueb;
};
//类C :同时继承类A 和 类B
class C : public A,public A2,public B
{
public:
//C(int i, int j, int k) :A(i),A2(i),B(j),m_valuec(k)
C(int i, int j, int k) :A(i),A2(i),B(j),Grand(i),m_valuec(k) //是孙类 来初始化爷爷类 因为这是虚基类
{
cout << "调用了类C构造函数"<< endl;
}
virtual ~C(){
cout << "调用了类C析构函数"<< endl;
}
void myinfoC()
{
cout << m_valuec << endl;
}
public:
int m_valuec;
};
int main()
{
//同一个派生列表中,只能出现一次, 但是:有两种情况例外
//a)派生类可以通过它的两个直接基类分别继承同一个间接基类
//b) 直接继承某个基类,然后通过另一个基类间接继承该类(既是爹又是爷)
C test(10,20,30);//有两个Grand,占空间,名字冲突,不知道通过谁来调用 m_valuegrand;
//虚基类:无论这个类在继承体中出现多少次,派生类中,都只会包含唯一一个共享的虚基类 子内容。
//每个Grand的子类都要虚继承Grand类,那么才能保证Grand的孙类能够虚继承Grand
//说明(1)现在是C类来初始化虚基类,如果c有了子类,那么由C类孩子来初始化Grand类
//(2)初始化顺序问题:***先初始化虚基类部分*** ,然后再按照派生列表来初始化。
//如果有多个虚基类n呢?那么就按照派生列表顺序来初始化虚基类
return 0;
}
3.15 c++虚基类 虚继承 (虚派生)
猜你喜欢
转载自blog.csdn.net/qq_41543888/article/details/89944111
今日推荐
周排行