派生类对象 - Braced init

时间:2017-05-27 14:58:05

标签: 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未初始化

问题:

为什么braced-init语法不适用于Child类?

1 个答案:

答案 0 :(得分:3)

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

  

没有虚拟,私有或受保护(自C ++ 17以来)基类

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

正如在同一链接中所述,只要基类不是虚拟的,私有的或受保护的,就可以在C ++ 17中使用它。