lvdan86546853 2016-12-28 04:18 采纳率: 0%
浏览 1287

C++ 默认构造函数问题

纯问题讨论,在看inside object,涉及到 nontrivial编译器合成的默认构造函数,第3个nontrivial 默认构造函数的意思是 :假设A类无构造函数,且含虚函数(声明或者继承(继承)),合成nontivial默认构造函数,
问题是,如果是A自己声明,那么必然合成的默认构造需要做一些初始化vptr和vtbl工作,但是如果是从基类B继承过来的这种情况,则又是?
class B{
public:
B(){}
virtual void foo(){};
}
class A:public B{
public:
void foo() overide{};
virtual goo(){}
}

前提:A无任何构造函数,编译器需要合成(nontrivial 或trivial默认构造);父类B有下面2种

1、基类B有自己定义的默认构造函数
2、B 没有构造函数,需要合成

对于1,A继承B,B由于有自己的默认构造函数,A在编译器合成的时候,需要安插B的默认构造函数代码进去,但此时B有自己定义默认构造,需要安插B的一些初始化vptr和vtbl代码在B的构造函数中?
对于2,A继承B,B没有构造函数,需要编译器合成B的构造函数(nontrivial,B含有虚函数,已经和用户显示定义的默认构造无差别),A也没有默认构造,需要合成,需要安插B的默认构造函数代码?

可能是对继承的细节不是很了解,刚刚才开始看inside,希望了解的大神解惑,谢谢

  • 写回答

1条回答 默认 最新

  • tang_cheng 2016-12-28 06:24
    关注

    在C++的类内部存储结构中,继承链上只有有一个类包含了虚函数,就意味着从这个类开始派生的所有子类都隐式包含了虚函数,而并不关心你在派生类中是否真正用到了虚函数。
    还有就是,构造函数的代码是在编译时候自动为每个类都生成自己的一份,而并非你所谓的AB类合并代码。它的初始化是通过继承链不断向上回溯的。所谓的默认缺省构造函数其实就是一个没参数没内容的空构造函数而已。从理论上来说,任何类编译时候,如果发现没定义构造函数,都会自动创建一个默认构造函数。这只是为了使用的方便性并且能把以前C写的代码比较容易的移植过来而已。
    这本书里想告诉你的是:如果这类或它的继承链中无虚函数,则这个默认构造函数将不会被自动创建。这是为了大量的struct类的构造体运行时候的效率提高而已。
    而且不同的编译器内部实现也是大相径庭的,所以这种事情基本上理解它的思想就够了,如果太认真你就输了。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)