c++ - 继承构造函数并额外添加
问题描述
我有一个 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);
};
我是否需要重新定义所有构造函数(比这个例子中的更多)还是有其他解决方案?
解决方案
这是一个重复问题的最小、完整和可验证的示例。
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{});
};
推荐阅读
- javascript - 搜索文本修剪脚本后 livewire 不起作用“...查看更多”
- github-pages - 如何获取 gh 页面的下拉菜单?
- node.js - 为什么 Eclipse 需要 node.js?
- python - 同时运行 asyncio bot 到 Tkinter GUI
- python - 'int' 对象不是 python3 上的可调用问题
- android - 参数必须是数组
- c# - 将 params 数组作为每个单独的参数传递
- docker - PyTorch:NVIDIA NGC 映像还是 Docker Hub 映像?
- node.js - 如何在 rxjs 中等待 lambda 函数的结果
- javascript - 如何让我的 discord.js 机器人“观看 X 服务器”状态自动更新?