重载继承的构造函数
Overloading inherited constructors
给定以下基数 class:
class Base {
int a, b;
public:
Base(int a, int b=42): a(a), b(b) { }
};
还有一个 class 派生自基数:
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) {}
这很接近,但是太冗长了,如果基 class 的构造函数被继承则不起作用。即如果 using Base::Base
出现在 class 中(那么它默认为那些构造函数并且不初始化字段 b
)。
如果基础 class 继承的构造函数不存在,即删除 using Base::Base
.
这是完成这项工作的唯一方法吗?即通过删除 using Base::Base
并在每个派生的 class 中使用可变参数模板构造函数?有没有更简洁的方法来重载继承的构造函数?
我正在使用 C++17。
在这种情况下,您需要做的就是为 c
提供一个 in class 初始化器
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
.
给定以下基数 class:
class Base {
int a, b;
public:
Base(int a, int b=42): a(a), b(b) { }
};
还有一个 class 派生自基数:
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) {}
这很接近,但是太冗长了,如果基 class 的构造函数被继承则不起作用。即如果 using Base::Base
出现在 class 中(那么它默认为那些构造函数并且不初始化字段 b
)。
如果基础 class 继承的构造函数不存在,即删除 using Base::Base
.
这是完成这项工作的唯一方法吗?即通过删除 using Base::Base
并在每个派生的 class 中使用可变参数模板构造函数?有没有更简洁的方法来重载继承的构造函数?
我正在使用 C++17。
在这种情况下,您需要做的就是为 c
提供一个 in class 初始化器
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
.