避免复制子类中的所有构造函数
Avoid copying all constructors in subclasses
所以一个基类有多个构造函数:
sf::Sprite()
sf::Sprite(const Texture& texture)
sf::Sprite(const Texture& texture, const IntRect& rectangle)
我多次对这个类进行子类化:
class Sub : public sf::Sprite {
public:
Sub() : sf::Sprite() {};
Sub(const Texture& texture) : sf::Sprite(texture) {};
Sub(const Texture& texture, const IntRect& rectangle) : sf::Sprite(texture, rectangle) {};
// My subclass specific code
};
如您所见,我必须为每个子类重复这三个构造函数。有没有办法避免这种情况,因为构造函数通常不做任何特殊的事情?有时不过,我需要一些特定于类的初始化,因此直接复制所有内容并不总是可行的。
您可以通过继承构造函数来实现此目的(自 C++11 起)。
如果 using-声明引用所定义的类的直接基的构造函数(例如
using Base::Base;
),在初始化派生类时,该基的所有构造函数(忽略成员访问)都对重载解析可见。
例如
class Sub : public sf::Sprite {
public:
using sf::Sprite::Sprite;
// My subclass specific code
};
如果使用继承的构造函数来初始化Sub
,则使用继承的构造函数初始化sf::Sprite
子对象,并且Sub
的所有其他成员都像由默认的默认构造函数一样进行初始化。
如果有一些特殊情况需要处理,你仍然可以在Sub
中定义构造函数,具有相同签名的继承构造函数将被隐藏。
与任何其他非静态成员函数的 using 声明一样,如果继承的构造函数与派生函数之一的签名匹配,则派生中的版本将隐藏该构造函数,使其在查找中隐藏。
可以使用using
关键字继承基类的构造函数,不包括特殊构造函数(默认、复制、移动)。要缩短默认构造函数,只需使用= default
即可。如果你想要特定于类的初始化,你可以简单地再次编写构造函数,就像你现在所做的那样。
class Sub : public sf::Sprite {
public:
Sub() = default;
using sf::Sprite::Sprite;
Sub(const Texture& texture)
{
// your custom code.
};
// My subclass specific code
};
如果您可以"继承"构造函数,即拥有一个具有完全相同参数的构造函数,只需按照其他答案中的说明使用using
。但是,如果derived
类的构造函数具有其他参数和/或需要某些特定于类的初始化,则可以使用可变参数模板。
struct base
{
base(int);
base(std::string const&);
base(some_type const&);
base(std::string const&, some_type const&);
/* ... */
};
struct derived : base
{
template<typename...Args>
derived(some_other_type const&x, Args&&...args)
: base(std::forward<Args>(args)...)
, private_datum(x)
{
construction_details(); // class-specific initialisation
}
private:
some_other_type private_datum;
void construction_details(); // implemented in source code
};
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类