1. 程式人生 > >虛基類宣告,初始化及呼叫順序

虛基類宣告,初始化及呼叫順序

1.如果虛基類中定義有帶引數的建構函式,並且沒有預設定義建構函式,則整個繼承結構中,所有直接或間接的派生類必須在建構函式的成員初始化列表中列出虛基類建構函式的呼叫。

2.建立物件時,如果這個物件中含有從基類繼承來的成員,則虛基類的成員有最遠派生類的建構函式通過呼叫虛基類的建構函式進行初始化的,該派生類的其他基類對虛基類建構函式的呼叫都自動忽略。

3.如果同一層次中同時有虛基類和非虛基類,則先呼叫虛基類建構函式,在呼叫非虛基類建構函式,最後呼叫派生類建構函式。

4.當有多個虛基類,或多個非虛基類時,呼叫:先左後右,自上而下。

5.如虛基類由非虛基類派生來,則先呼叫基類建構函式,在呼叫派生類建構函式。

class 派生類:virtual  繼承方式 類名{- - - - -}

例子如下:

#include<iostream>
using namespace std;
class Base{
public:
	Base(int sa)
	{
		a=sa;
		cout<<"constructing Base"<<endl;
	}
protected:
	int a;
};

class Base1:virtual public Base{
public:
	Base1(int sa,int sb):Base(sa)
	{
		b=sb;
		cout<<"constructing Base1"<<endl;
	}
protected:
	int b; 
};
class Base2:virtual public Base{
public:
	Base2(int sa,int sc):Base(sa)
	{
		c=sc;
		cout<<"constructing Base2"<<endl;
	}
protected:
	int c;
};
class Deriverd:public Base1,public Base2{
public:
	Deriverd(int sa,int sb,int sc,int sd):Base(sa),Base1(sa,sb),Base2(sb,sc)
	{    
		d=sd;
		cout<<"constructing Deriverd "<<endl;
	}
	void show()
	{
		cout<<"a="<<a<<endl;
		cout<<"b="<<b<<endl;
		cout<<"c="<<c<<endl;
		cout<<"d="<<d<<endl;
	}
private:
	int d;

};
int main()
{
	Deriverd dd(10,20,30,40);
	dd.show();
	return 0;
}