使用 using base::base; 可以继承基类构造函数,避免手动重复编写转发构造函数,从而减少代码量并提高可维护性;当基类有多个构造函数且派生类仅需简单继承时,推荐使用该方式,但需注意其无法处理虚基类、不支持构造函数参数修改或添加额外逻辑,并可能在多重继承时引发歧义,因此在需要精细控制构造过程的场景下仍应选择手动转发。

using BaseClass::BaseClass;
使用
using
using BaseClassName::BaseClassName;
例如,我们有一个基类
Base
class Base {
public:
int value;
// 默认构造函数
Base() : value(0) {
// std::cout << "Base default constructor" << std::endl;
}
// 带一个参数的构造函数
Base(int v) : value(v) {
// std::cout << "Base int constructor: " << v << std::endl;
}
// 带两个参数的构造函数
Base(int v1, int v2) : value(v1 + v2) {
// std::cout << "Base two-int constructor: " << v1 << ", " << v2 << std::endl;
}
};现在,如果你想让
Derived
Base
class Derived : public Base {
public:
// 使用 using 声明继承基类的所有构造函数
using Base::Base;
// 派生类可以有自己的成员和构造函数
// 例如,一个只属于 Derived 的构造函数
Derived(double d) : Base(static_cast<int>(d * 10)), derived_value(d) {
// std::cout << "Derived double constructor: " << d << std::endl;
}
double derived_value;
};现在,你可以像这样构造
Derived
// 像使用 Base 构造函数一样构造 Derived 对象 Derived d1; // 调用 Base::Base() Derived d2(10); // 调用 Base::Base(int) Derived d3(20, 30); // 调用 Base::Base(int, int) Derived d4(5.5); // 调用 Derived::Derived(double)
在幕后,编译器会为
Derived
Base
Base(int v)
Derived
// 编译器生成的伪代码,并非实际代码
Derived(int v) : Base(v) {
// 派生类自己的成员初始化,如果有的话
// 例如:derived_value = ...;
}这种机制让代码变得非常简洁,避免了大量的重复劳动。我个人觉得,这玩意儿就是为了解决那种,你明明知道派生类构造就是基类构造的简单转发,但又不得不写一堆重复代码的烦恼,简直是懒人福音。
using
你可能会问,我手动写转发构造函数不也一样吗?为什么要多此一举用
using
using
最直接的答案就是:减少重复代码和提高可维护性。想象一下,如果你的基类
Base
using
Derived
Derived(...) : Base(...) { ... }更要命的是,一旦
Base
Base
Derived
使用
using Base::Base;
Base
using
Base
Derived
Derived
从另一个角度看,它体现了“Don't Repeat Yourself (DRY)”的原则。如果派生类构造行为就是简单地调用基类构造,那为什么还要重复描述呢?
using
using
别以为
using
using
不影响默认/拷贝/移动构造函数的隐式生成:
using
using
using
using
Derived d;
访问权限问题:
using
private
using
using
多重继承下的歧义: 如果一个派生类从多个基类继承,并且这些基类中存在签名相同的构造函数,或者继承来的构造函数与派生类自身定义的构造函数签名冲突,那么在构造时可能会产生歧义。编译器会报错,让你明确指定要调用哪个构造函数。
不适用于虚基类(virtual base classes
using
不能修改参数或添加额外逻辑:
using
并非所有基类构造函数都会被“继承”: 只有那些在派生类中签名不冲突的基类构造函数才会被有效“继承”。如果基类构造函数的参数类型与派生类自身的某个构造函数完全一致,或者与另一个继承来的构造函数冲突,那么这个基类构造函数可能无法通过
using
理解这些“坑”能帮助你更好地利用
using
using
这两种方式都能达到派生类调用基类构造函数的目的,但它们在灵活性、代码量和维护成本上有着显著的差异。选择哪种方式,主要取决于你的具体需求和对代码控制粒度的要求。
1. using
using Base::Base;
using
2. 手动转发构造函数:
using
总结:
说到底,
using
如果你的派生类只是一个简单的扩展,不需要在构造时做太多“额外的事情”,那么
using
以上就是继承构造函数怎么用 using继承基类构造方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号