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

C++构造函数继承疑问:派生类默认构造函数未被调用

C++构造函数继承疑问:派生类默认构造函数未被调用

嘿,这个问题其实是对构造函数继承的一个常见误解,我来帮你捋清楚~

首先核心点:当你用using A::A;继承基类的构造函数时,派生类的这个“继承来的构造函数”和你自己写的B()默认构造函数是完全独立的两个构造函数,继承的构造函数并不会触发派生类默认构造的执行。

你引用的cppreference那段话,其实被你误解了一部分:

"If overload resolution selects one of the inherited constructors when initializing an object of such derived class, then the Base subobject from which the constructor was inherited is initialized using the inherited constructor, and all other bases and members of Derived are initialized as if by the defaulted default constructor (default member initializers are used if provided, otherwise default initialization takes place)."

这里说的“all other bases and members of Derived are initialized as if by the defaulted default constructor”,指的是**派生类的成员变量和其他基类(如果有的话)**的初始化规则,而不是说会去调用你写的B()默认构造函数的函数体。换句话说:

  • 继承的构造函数只会负责初始化基类A的部分
  • 对派生类B自己的成员(你代码里B没有额外成员)做默认初始化
  • 但绝对不会执行B()里的代码——因为B()是另一个独立的构造函数,只有当你用默认构造创建B对象(比如B b;)时才会被调用。

结合你的代码来看:当你写B b(12);时,编译器会调用从A继承来的B(int)构造函数(这个是编译器帮你生成的,等价于B(int i) : A(i) {}),它只会完成基类A的初始化,没有额外的逻辑,所以自然不会输出你期望的“Default constructor of B”。

如果想要达到你预期的输出效果,有两种常见解决办法:

  • 方法一:显式定义派生类的带参构造函数
    手动调用基类构造,然后添加自己的逻辑:

    class B : A
    {
    public:
        B()
        {
            std::cout << "Default constructor of B" << '\n';
        }
        // 显式定义带int参数的构造函数
        B(int i) : A(i)
        {
            std::cout << "Default constructor of B" << '\n';
        }
    };
    

    这样创建B b(12);时,就会先执行A的int构造,再执行B的int构造里的代码,输出你想要的内容。

  • 方法二:抽离通用初始化逻辑
    如果B()里的代码是所有构造都需要的通用初始化逻辑,可以把它抽成成员函数,在所有构造函数里调用:

    class B : A
    {
        void common_init()
        {
            std::cout << "Common initialization for B" << '\n';
        }
    public:
        B()
        {
            common_init();
            std::cout << "Default constructor of B" << '\n';
        }
        B(int i) : A(i)
        {
            common_init();
        }
    };
    

总结一下:继承的构造函数只是“借”了基类的构造逻辑来初始化基类部分,并不会自动触发派生类其他构造函数的执行,两者是完全独立的构造入口。

备注:内容来源于stack exchange,提问作者Horace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:59:50