![](/img/trans.png)
[英]Order of member variables initialization of the base class in the derived class (constructor)
[英]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.