首页 > 代码库 > 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++虚基类的初始化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。