首页 > 代码库 > C++虚基类的初始化

C++虚基类的初始化

 

 1 #include<iostream> 2 using namespace std; 3 class Base{ 4     public: 5         Base(int sa) 6         { 7             a=sa; 8             cout<<"Constructing Base"<<endl; 9         }10     private://私有变量,不可在派生类中直接使用 11         int a;12 };13 class Base1:virtual public Base{14     public:15         Base1(int sa,int sb):Base (sa)16         {17             b=sb;18             cout<<"Constructing Base1"<<endl;19         }20     private:21         int b;22 }; 23 class Base2:virtual public Base{24     public:25         Base2(int sa,int sc):Base(sa)26         {27             c=sc;28             cout<<"Constructing Base2"<<endl;29         }30     private:31         int c;32 };33 class Derived:public Base1,public Base2{34     public:35         Derived(int sa,int sb,int sc,int sd)36         :Base(sa),Base1(sa,sb),Base2(sa,sc)37         //如果Base类不是虚基类,就不能使用这种方式调用基类的构造函数 38         {39             d=sd;40             cout<<"Constructing Derived"<<endl;41         }42     private:43         int d;44 };45 int main()46 {47     Derived obj(2,4,6,8);48     return 0;49 }50 51 /*52 执行结果 53 Constructing Base54 Constructing Base155 Constructing Base256 Constructing Derived57 */ 

 从分析上述程序中虚基类Base的构造函数只执行了一次。

显然,当Derived的构造调用了虚基类Base的构造函数之后,

类Base1和类Base2对Base构造函数的调用被忽略了,这也是初始化虚基类

和初始化非虚基类不同的地方。

关键字virtual与派生方式关键字(public或private)的先后顺序无关紧要,

他只说明是“虚拟派生”。

一个基类在作为某些派生类虚基类的同时,又作为另一些派生类的非虚基类,

这种情况是允许的。

 

C++虚基类的初始化