此问题在此处已有答案:
In C++, why do virtual functions disqualify class type as aggregate? [duplicate](1个答案)
C++ aggregates have no virtual functions?(2个答案)
昨天就关门了。
默认初始化在RegBaseB
中是可能的,而在RegBaseA
中是不可能的原因是什么?
struct RegBaseA
{
union {unsigned int value;};
virtual unsigned int get_num_bits() const {return 32;};
};
struct RegBaseB
{
union {unsigned int value;};
};
int main()
{
// RegBaseA reg_a {10}; // not allowed
RegBaseB reg_b {10};
}
字符串
2条答案
按热度按时间tjrkku2a1#
RegBaseB
满足aggregate initialization的标准,但不满足具有虚函数的RegBaseA
的标准。由于没有声明特殊的构造函数,编译器正在尝试聚合初始化,在这里被识别为
RegBaseB reg_b {10};
。nfg76nw02#
B
中的初始化是可以使用的,因为编译器不需要“做”任何事情来设置它。在编写二进制文件之后,没有计算或初始化值的工作。B
非常类似于旧的C风格的“普通旧数据类型”,只是内存中的固定布局。A
确实可以工作,因为它需要一个动态的(读作“运行时”)调度表来确定正确的函数,因为它被声明为virtual
。