c++ - 派生类成员由基类构造函数初始化

标签 c++

我对这段代码有一个疑问,就是这段代码不正确。它可能会在运行时崩溃。因为 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/

相关文章:

c++ - 使用 std::atomic<int> 安全地连接到程序结构以进行线程访问?

c++ - std::string.resize() 和 std::string.length()

c++ - 如何将一个项目的构建文件复制到第二个项目的 include/library 目录?

c++ - 消息顺序不正确(使用 io_service::wrap)

c++ - 定义 const 数组类型的语法

java - Java中调用native代码如何判断是不是内存泄漏?

按字符串名称的 C++ 通用对象工厂

c++ - 多维 vector 和 csv 文件

c++ - Visual Studio 在附加包含文件夹中找不到头文件

c++ - Ofstream 比 cout 快? ||存储速度快于视觉输出