基类构造函数的派生类成员初始化

Posted

技术标签:

【中文标题】基类构造函数的派生类成员初始化【英文标题】:Derived Class Member Initialization by base class constructor 【发布时间】:2013-12-13 07:41:56 【问题描述】:

我对这段代码有一个疑问,即这段代码不正确。它可能会在运行时崩溃。由于 p 指针指向 派生 类成员变量(char 数组)的地址 但是在派生类构造函数 base 类构造函数被调用之前,派生类的内存初始化和分配尚未完成。因此,当我们在基类构造函数中执行 strcpy 时,此代码可能会崩溃。

class Base

 public: 
  char *p;
  Base();
  Base(char *a):p(a)
  
     sprintf(a,"HELLO");
  ;
;
class Derived:public Base

 public:
 char arr[10];
 Derived():Base(arr)
 

 ;

;

int main()

   Derived d = new Derived();
return 0;

从这段代码中,我打算将 char 数组的地址提供给需要在传递的地址上写入一些字符串的基类。 但我不确定这段代码是否会一直有效。 请澄清。

【问题讨论】:

您的疑问符合条件。只是在构造函数中传递指针是无害的,在sprintf 中使用它不是。 【参考方案1】:

这是明确定义的,但很脆弱 - 如果您更改 arr 的类型,它可能会损坏。

在运行任何构造函数之前为整个对象分配存储空间,并且由于arr 的初始化很简单,它的生命周期在存储空间分配后立即开始。因此它可以在 Base 构造函数中使用。

如果它是一个不平凡的类型,比如std::string,那么它就不能在Base 构造函数中使用,并且你会有未定义的行为。

【讨论】:

这种行为是标准的还是可以根据编译器而变化? @anshulgarg:这是标准的。如果您需要血淋淋的细节,对象生命周期在 C++11 3.8 中指定。

以上是关于基类构造函数的派生类成员初始化的主要内容,如果未能解决你的问题,请参考以下文章

C++基类和派生类的构造函数

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

虚函数总结

C++中派生类的构造函数怎么显式调用基类构造函数?

阿里笔试题-派生类构造函数 创建顺序

为啥不能在派生类的构造函数初始化列表中初始化基类的数据成员?