首页 > 解决方案 > 继承构造函数并额外添加

问题描述

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

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

标签: c++inheritanceconstructor

解决方案


这是一个重复问题的最小、完整和可验证的示例。

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{});
};

推荐阅读