You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 };

针对你的三个疑问,解答如下:

  1. 为何对象c可由基类对象构造?
    CCC是C17标准定义的聚合类——它没有用户声明的构造函数、没有私有/保护的非静态数据成员、没有虚函数和虚基类,同时C17扩展了聚合类的范围,允许聚合类继承公开基类。对于这类聚合派生类,你可以用基类对象组成的列表做聚合初始化,每个基类对象会对应初始化派生类里对应的基类子对象。

  2. 该语法的名称及C标准条款
    这个语法是聚合初始化(Aggregate Initialization)的扩展,是C
    17新增的特性,对应C标准中的[dcl.init.aggr]条款。C14及更早版本中,聚合类不能包含基类,因此这种初始化方式不被支持。

  3. 构造c时调用拷贝构造函数的标准依据
    在聚合初始化过程中,用已有的基类对象(a和b)初始化派生类的基类子对象时,会执行拷贝初始化操作。根据C++标准[dcl.init.aggr]的规则,聚合初始化的每个初始化器会用来初始化对应的元素(这里的元素就是派生类的基类子对象),用对象作为初始化器时,会调用该类的拷贝构造函数完成基类子对象的初始化。

内容的提问来源于stack exchange,提问作者Sheperd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:20:32