继承构造函数并另外添加

时间:2018-09-10 18:07:40

标签: c++ inheritance constructor

我有一个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);
};

我是否需要重新定义所有构造函数(在此示例中有更多的构造函数)还是有其他解决方案?

1 个答案:

答案 0 :(得分:0)

这是一个重复问题的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{});
};