c++ - 重载继承的构造函数
问题描述
给定以下基类:
class Base {
int a, b;
public:
Base(int a, int b=42): a(a), b(b) { }
};
还有一个从基派生的类:
class Derived: public Base {
using Base::Base; // inherit Base constructors
bool c;
public:
Derived(int a): Base(a), c(true) { }
Derived(int a, int b): Base(a, b), c(true) { }
};
有没有办法避免必须创建两个单独的构造函数Derived
,而是重载继承的Base
构造函数来初始化的额外成员Derived
?
我正在考虑使用这样的东西:
template <typename... Args,
typename std::enable_if_t<std::is_constructible_v<Base, Args&&...>, int> = 0>
explicit Derived(Args&&... args):
Base(std::forward<Args>(args)...), c(true) {}
这很接近,但过于冗长并且如果基类的构造函数被继承则不起作用。即如果using Base::Base
存在于类中(那么它默认为那些构造函数并且不初始化字段b
)。
如果不存在基类继承的构造函数(即删除using Base::Base
.
这是完成这项工作的唯一方法吗?即通过在每个派生类中删除using Base::Base
和使用可变参数模板构造函数?有没有更简洁的方法来重载继承的构造函数?
我正在使用 C++17。
解决方案
在这种情况下,您需要做的就是提供c
一个类内初始化程序
class Derived : public Base {
using Base::Base;
bool c = true;
};
允许您使用的构造函数,并且在所有情况下都Base
将初始化c
为。true
推荐阅读
- python - TypeError:“节点”对象不可迭代
- c# - Xamarin.Forms 处理通知启动 (UWP)
- scala - Foreach 无法打印列表元素
- kotlin - 使用 mediaPlayer.release() 时 mediaPlayer 崩溃
- excel - sumif 在 VBA 中具有动态列和范围
- c++ - 链接器没有看到我的 Class.cpp
- r - 如何防止 geom_text_repel 使用默认编号排序列表在散点图上标记点?
- c++ - 私有静态成员 - 编译错误?
- javascript - 在 VSCode 中为 React 组件自动添加标签
- c++ - Visual Studio C++ LNK1104:无法打开文件 pthreadsVC2.lib,尽管从链接器中删除了依赖项