基类构造函数的派生类成员初始化
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 中指定。以上是关于基类构造函数的派生类成员初始化的主要内容,如果未能解决你的问题,请参考以下文章