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
相关产品推荐
相关产品推荐

