繁体   English   中英

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

[英]Derived Class Member Initialization by base class constructor

我对此代码有疑问,认为该代码不正确。 由于p指针指向派生类成员变量(char数组)的地址,但在派生类构造函数类构造函数被调用之前,因此尚未完成内存初始化和派生类的分配。 因此,在基类构造函数中执行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数组的地址提供给基类​​,在基类中需要在传递的地址上写入一些字符串。 但是我不确定这段代码是否会一直有效。 请澄清。

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

在运行任何构造函数之前,已为完整对象分配了存储,并且由于arr初始化很简单,因此其生存期将在分配存储后立即开始。 因此,它在Base构造函数中可用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM