C++中复用基类多构造函数同时调用派生类特定构造函数的实现方法
C++中复用基类多构造函数同时调用派生类特定构造函数的实现方法
我完全懂你的困扰——基类A有好几个构造函数,要是给派生类B挨个写对应的重载构造函数,不仅麻烦还容易漏,但你又希望不管用哪个参数创建B对象,都能在调用对应基类构造的同时,执行B自己那套固定的初始化逻辑(就是你现在默认构造里的输出内容)。
其实不用重复写一堆构造函数,用模板构造函数就能轻松解决这个问题,具体步骤如下:
步骤1:抽离B的公共初始化逻辑
首先把你B类默认构造里的代码抽成一个独立的私有成员函数,这样所有构造函数都能复用这段逻辑:
class B : A { private: // 把B的固定初始化逻辑放在这里 void init() { std::cout << "Default constructor of B" << '\n'; }
步骤2:用模板构造函数转发参数给基类
然后写一个模板构造函数,它能匹配任意参数列表,通过完美转发把参数传递给基类A对应的构造函数,之后再调用我们抽离的init()函数:
public: // 保留原来的默认构造 B() { init(); } // 模板构造函数:匹配所有A支持的参数组合 template<typename... Args> B(Args&&... args) : A(std::forward<Args>(args)...) { init(); } };
测试效果
现在你创建B对象时,不管传int、double还是其他A支持的参数,都会先调用对应的基类构造,再执行B的初始化逻辑:
- 执行
B b(12);的输出:
Inside the constructor of A with one int argument
Default constructor of B
End of main
- 执行
B b(4.2);的输出:
Inside the constructor of A with one double argument
Default constructor of B
End of main
注意事项
如果基类A有复制/移动构造函数,这个模板构造函数可能会优先匹配复制/移动操作,导致默认的复制/移动行为被覆盖。如果需要保留默认的复制/移动构造,记得显式声明:
B(const B&) = default; B(B&&) = default;
这样就不用为每个基类构造函数都写一个派生类构造函数,一次性搞定所有情况啦~
备注:内容来源于stack exchange,提问作者463035818_is_not_an_ai
相关产品推荐
相关产品推荐

