C++多继承派生类CCC可由基类对象构造的原因及标准依据
多继承聚合类的基类对象初始化问题
先贴出你提供的代码:
class AAA { int m_Int; public: AAA() : m_Int{12} {} }; class BBB { int m_Int1; public: BBB() : m_Int1{12} {} }; class CCC : public AAA, public BBB {}; AAA a; BBB b; CCC c{ a, b };
针对你的三个疑问,解答如下:
为何对象c可由基类对象构造?
CCC是C17标准定义的聚合类——它没有用户声明的构造函数、没有私有/保护的非静态数据成员、没有虚函数和虚基类,同时C17扩展了聚合类的范围,允许聚合类继承公开基类。对于这类聚合派生类,你可以用基类对象组成的列表做聚合初始化,每个基类对象会对应初始化派生类里对应的基类子对象。该语法的名称及C标准条款
这个语法是聚合初始化(Aggregate Initialization)的扩展,是C17新增的特性,对应C标准中的[dcl.init.aggr]条款。C14及更早版本中,聚合类不能包含基类,因此这种初始化方式不被支持。构造c时调用拷贝构造函数的标准依据
在聚合初始化过程中,用已有的基类对象(a和b)初始化派生类的基类子对象时,会执行拷贝初始化操作。根据C++标准[dcl.init.aggr]的规则,聚合初始化的每个初始化器会用来初始化对应的元素(这里的元素就是派生类的基类子对象),用对象作为初始化器时,会调用该类的拷贝构造函数完成基类子对象的初始化。
内容的提问来源于stack exchange,提问作者Sheperd
相关产品推荐
相关产品推荐

