我对这段代码有一个疑问,就是这段代码不正确。它可能会在运行时崩溃。因为 p 指针指向 derived 类成员变量(字符数组)的地址 但在派生类构造函数 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 数组的地址提供给基类,其中需要在传递的地址上写入一些字符串。 但我不确定这段代码是否会一直有效。 请澄清。
最佳答案
这是明确定义的,但很脆弱 - 如果您更改 arr
的类型,它可能会中断。
在运行任何构造函数之前为完整对象分配存储空间,并且由于 arr
具有简单的初始化,它的生命周期在分配存储空间后立即开始。因此,它可用于 Base
构造函数。
如果它是一个非平凡的类型,比如 std::string
,那么它就不能在 Base
构造函数中使用,并且你有 undefined行为。
关于c++ - 派生类成员由基类构造函数初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20561441/