所以基类有多个构造函数:
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
};
如您所见,我必须为每个子类重复这三个构造函数。有没有办法避免这种情况,因为构造函数通常不做任何特殊的事情? 有时候我需要某些类特定的初始化,所以直接复制所有内容并不总是可行的。
答案 0 :(得分:35)
您可以通过inheriting constructors完成此操作(自C ++ 11开始)。
如果using声明引用了正在定义的类的直接基础的构造函数(例如
using Base::Base;
),那么在初始化派生时,该基础的所有构造函数(忽略成员访问)都会显示为重载解析类。
e.g。
class Sub : public sf::Sprite {
public:
using sf::Sprite::Sprite;
// My subclass specific code
};
如果继承的构造函数用于初始化Sub
,则使用继承的构造函数初始化sf::Sprite
子对象,并初始化Sub
的所有其他成员,就像默认的默认值一样构造函数。
如果需要处理某些特殊情况,您仍然可以在Sub
中定义构造函数,将隐藏具有相同签名的继承构造函数。
与任何其他非静态成员函数的using声明一样,如果继承的构造函数与Derived的其中一个构造函数的签名匹配,则它将被Derived中的版本隐藏。
答案 1 :(得分:15)
您可以使用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
};
答案 2 :(得分:7)
如果你能继承'构造函数,即具有完全相同参数的构造函数,只需使用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
};