在下面的代码中,
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/