C++构造函数语义学(三)(基于C++对象模型)

带有虚基类的情况。

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.编译器合成出来的默认构造函数会显式的对类中的数据成员进行的值的设定。

 

 

强调:

只有在需要的时候编译器才会为类合成一个默认的构造函数,且合成所作的工作都是编译器认为需要做的,对于不需要的,即使合成了,那一部分工作编译器也不会为其分担丝毫!!!

原文链接: https://www.cnblogs.com/SunShine-gzw/p/13181318.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++构造函数语义学(三)(基于C++对象模型)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/358082

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午12:06
下一篇 2023年3月2日 下午12:06

相关推荐