重载继承的构造函数
Overloading inherited constructors
给定以下基类:
class Base {
int a, b;
public:
Base(int a, int b=42): a(a), b(b) { }
};
以及从 base 派生的类:
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
。
似乎您正在寻找的是一种继承Base
构造函数的方法,同时只是将Derived
的成员初始化为特定的东西。为此,我们可以使用默认的成员初始值设定项:
class Derived: public Base {
public:
using Base::Base;
private:
bool c = true;
};
构造Derived(42)
将调用Base(int)
构造函数,但也初始化c
以true
。
相关文章:
- 具有相同名称的类的构造函数继承
- 多复制构造函数继承中的惊人行为
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 无法从 c++ 中的构造函数继承
- 在构造函数继承中使用默认构造函数
- 构造函数继承和直接成员初始化
- C++ - 使用私有参数的构造函数继承
- 通过可变参数模板进行C++11构造函数继承
- C++11构造函数继承和不带参数的构造函数
- C++11 - 构造函数继承
- C++构造函数继承
- 使用 C++11 编译器的构造函数继承正在生成错误
- 选择性构造函数继承"Ambiguous resolution"错误
- 什么是构造函数继承
- C++对象中的构造函数继承与方法继承
- C++构造函数继承没有匹配的函数
- C++构造函数继承(从派生类调用构造函数)
- 模板构造函数继承的标准符合语法是什么
- C++构造函数继承错误