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

时间:2013-12-13 07:41:56

标签: c++

我对此代码有一个疑问,即此代码不正确。它可以在运行时崩溃。由于 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数组的地址提供给基类​​,其中一些字符串需要在传递的地址上写入。 但我不确定这段代码是否会一直有效。 请澄清。

1 个答案:

答案 0 :(得分:4)

这是明确定义的,但很脆弱 - 如果你改变arr的类型,它可能会中断。

在运行任何构造函数之前为整个对象分配存储,并且由于arr具有简单的初始化,因此一旦分配了存储,其生命周期就开始了。因此它可以在Base构造函数中使用。

如果它是一个非平凡类型,如std::string,则它在Base构造函数中不可用,并且您有未定义的行为。