我有一个Saver类(从QObject派生)和一个,它是从这个Saver类(Creator)派生的。在Saver类中,我定义了一些构造函数,我想在初始化Creator类时使用这些构造函数。但是我在Creator类中也有额外的构造函数。我用:
Saver::Saver在Creator类中继承构造函数,并且它运行良好,除非我添加了其他构造函数。下面是这些类的头:
class Saver : public QObject
{
Q_OBJECT
public:
explicit Saver();
explicit Saver(QVector<QOpenGLVertexArrayObject *> vaos);
explicit Saver(QVector<QOpenGLTexture *> textures);
};
class Creator : public Saver
{
Q_OBJECT
public:
using Saver::Saver;
//Works well unless I add the following two lines
Creator(QVector<Creator *> creators);
Creator(Creator *creator);
};我是否需要重新定义所有构造函数(比本例中有更多的构造函数),还是有其他解决方案?
发布于 2018-09-10 18:47:44
这里有一个重复问题的Minimal, Complete, and Verifiable example。
struct type_a {};
struct type_b {};
class Saver
{
public:
explicit Saver() {}
explicit Saver(type_a) {}
};
class Creator : public Saver
{
public:
using Saver::Saver;
Creator(type_b) {}
};
int main()
{
Creator c1;
Creator c2(type_a{});
Creator c3(type_b{});
};解决该问题的一种方法是从基类的默认构造函数中删除explicit限定符,并在派生类中添加默认构造函数的默认实现。
struct type_a {};
struct type_b {};
class Saver
{
public:
Saver() {}
explicit Saver(type_a) {}
};
class Creator : public Saver
{
public:
using Saver::Saver;
Creator() = default;
Creator(type_b) {}
};
int main()
{
Creator c1;
Creator c2(type_a{});
Creator c3(type_b{});
};解决此问题的另一种方法是在初始化程序列表中显式使用基类的默认构造函数。您仍然需要在派生类中添加默认构造函数的默认实现。
struct type_a {};
struct type_b {};
class Saver
{
public:
explicit Saver() {}
explicit Saver(type_a) {}
};
class Creator : public Saver
{
public:
using Saver::Saver;
Creator() = default;
Creator(type_b) : Saver() {}
};
int main()
{
Creator c1;
Creator c2(type_a{});
Creator c3(type_b{});
};https://stackoverflow.com/questions/52263259
复制相似问题