3.15 c++虚基类 虚继承 (虚派生)

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_41543888/article/details/89944111