在下面的代码中,
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
类?
答案 0 :(得分:3)
这是aggregate initialization,因为聚合初始化是合法的,类不能有基类:
没有虚拟,私有或受保护(自C ++ 17以来)基类
Child
显然有一个基类(Base
),因此你会收到错误。
正如在同一链接中所述,只要基类不是虚拟的,私有的或受保护的,就可以在C ++ 17中使用它。