c++ - 派生类对象 - Braced init

标签 c++ c++11

在下面的代码中,

struct X
{
  int a;
  int b;
  void *ptr;
};

class Base
{
 public:
  int a;
  int b;
  void *ptr;
};

class Child : public Base
{
public:
  int c;
};

X obj  = { 9, 2, malloc(TWOBYTES), };
Base obj1  = { 3, 4, malloc(TWOBYTES), };
Child obj2  = { 8, 4, malloc(TWOBYTES), 10, }; // Error

error: could not convert ‘{8, 4, malloc(2ul), 10}’ from ‘<brace-enclosed initializer list>’ to ‘Child’
   Child obj2  = { 8, 4, malloc(TWOBYTES), 10, };
                                               ^

obj2 没有被初始化

问题:

为什么大括号初始化语法不适用于 Child 类?

最佳答案

这是 aggregate initialization ,为了使聚合初始化合法,类不能有基类:

no virtual, private, or protected (since C++17) base classes

Child 显然有一个基类 (Base),因此你会得到一个错误。


正如同一链接中所述,只要基类不是虚拟的、私有(private)的或 protected ,这在 C++17 中是允许的。

关于c++ - 派生类对象 - Braced init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44218321/

相关文章:

c++ - 我们是否有时必须根据 C++ 标准编写具有未定义行为的代码?

C++11 声明工厂是基类的友元

c++ - 引用模板类型推导

c++ - 如何使用自定义 STL vector 类避免智能指针 delete[] 异常?

c++ - 如何将 STX/ETX(C0 控制代码)写入 BSTR 缓冲区 IXMLDOMElement*

c++ - 具有 PBO 支持的高级 OpenGL 库

c++ - 从函数 : optimizing speed and modern style 返回容器

c++ - [[carries_dependency]] 属性是什么意思?

c++ - 如何获取打开的文件路径

c++ - weak_ptr C++ 中的比较运算符