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

C++ 继承基类构造函数并在子类新增额外初始化逻辑的实现方法

问题根因说明

你现有代码运行时只会触发基类的ExtraSetup,原因是基类构造函数执行阶段,子类的内存布局还未完成初始化,虚函数调度只会指向基类的实现,无法触发子类重写的版本,这是C++的语法规则限制,和虚函数本身的设计逻辑相关。

可选实现方案

方案1:显式定义子类构造(最简单,无额外开销)

完全不需要虚函数、也不需要继承构造,直接在子类构造的初始化列表调用基类构造后,末尾执行自己的专属初始化逻辑即可,代码最直观易维护:

#include <iostream>
using namespace std;

class Base {
protected:
    int base_number_;
public:
    Base(int number){
        base_number_ = number;
    }
};

class Sub : public Base {
public:
    // 显式定义构造,先调用基类构造再执行子类初始化
    Sub(int number) : Base(number) {
        ExtraSetup();
    }
private:
    int sub_number_;
    void ExtraSetup(){
        sub_number_ = 200;
        cout << "This should run" << endl;
    }
};

int main()
{
    Sub sub_object(100);
    return 0;
}

方案2:CRTP静态多态(适合基类有多个构造函数的场景)

如果基类存在多个不同参数的构造函数,不想每个都在子类中重复定义,可以用CRTP实现编译期调度,不需要虚函数开销,也能直接继承基类的所有构造函数:

#include <iostream>
using namespace std;

// CRTP基类,模板参数传入子类类型
template <typename Derived>
class Base {
protected:
    int base_number_;
public:
    Base(int number){
        base_number_ = number;
        // 编译期确定调用子类的ExtraSetup,无运行时开销
        static_cast<Derived*>(this)->ExtraSetup();
    }
};

class Sub : public Base<Sub> {
    // 声明基类为友元,允许调用私有初始化函数
    friend class Base<Sub>;
public:
    // 直接继承基类所有构造函数,无需重复定义
    using Base::Base;
private:
    int sub_number_;
    void ExtraSetup(){
        sub_number_ = 200;
        cout << "This should run" << endl;
    }
};

int main()
{
    Sub sub_object(100);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:57:04