C++构造函数语义学(三)(基于C++对象模型)
带有虚基类的情况。
1 #include<iostream> 2 using namespace std; 3 class X 4 { 5 public: 6 int i; 7 }; 8 class A:public virtual X 9 { 10 public: 11 int j; 12 }; 13 class B:public virtual X 14 { 15 public: 16 double d; 17 }; 18 class C:public A, public B 19 { 20 public: 21 int k; 22 }; 23 void foo(A* pa) 24 { 25 pa->i = 1024; 26 } 27 int main() 28 { 29 foo(new A); 30 foo(new C); 31 while (1); 32 return 0; 33 }
分析:
如果不引入虚基类,那么在调用的时候,会发生调用冲突,编译器不知道该调用那个数据成员。
有了虚基类后,假设我们没有定义自己的构造函数,那么编译器会为其合成一个出来,生成一个指向虚基类表的指针。
关于虚基类的布局,以后再深入探讨。
总结:
四种情况,编译器会在需要的时候自己合成一个默认的构造函数出来:
1.带有默认构造函数的类成员
2.带有默认构造函数的基类
3.带有虚函数的类
4.带有虚基类的类
错误思想:
1.任何一个类如果自己没有定义默认的构造函数,那么编译器都会合成一个出来。
2.编译器合成出来的默认构造函数会显式的对类中的数据成员进行的值的设定。
强调:
只有在需要的时候编译器才会为类合成一个默认的构造函数,且合成所作的工作都是编译器认为需要做的,对于不需要的,即使合成了,那一部分工作编译器也不会为其分担丝毫!!!