c++ - 如何从 C++ 中的未命名派生类调用非默认父构造函数?
问题描述
在 C++ 中,如果直接创建对象,则可以将一次性结构和类声明为未命名:
struct { int x; int y; } point;
未命名的类也可以从基类继承。例如,这对于从基本处理器接口创建不同“处理器”列表很有用。这里有一个简单的例子:
struct Processor {virtual int op(int a, int b) = 0;};
struct : Processor {int op(int a, int b) override { return a+b; }} Adder;
struct : Processor {int op(int a, int b) override { return a*b; }} Multiplier;
所以两者都Adder
成为Multiplier
接口的单一派生对象Processor
。但是,如果基础处理器具有更多结构并具有构造函数,那需要参数怎么办?让我们看看这个例子:
class Processor {
private:
std::string name;
public:
virtual int op(int a, int b) = 0;
const std::string& getName() const { return name; }
Processor(std::string name) : name(name) {}
};
如何为此处理器创建一个未命名的子类,例如“加法器”。天真的尝试:
class : public Processor {
public:
int op(int a, int b) override { return a + b; }
} Adder { "Adder" };
不幸的是失败了,因为未命名的类没有隐式生成的构造函数,可以接受"Adder"
作为它的参数。并且显式声明这样的构造函数也是不可能的,因为不可能在未命名的类中声明构造函数:构造函数的名称与类相同,但如果没有类名,则也没有构造函数名称.
我知道,有一些简单的解决方法:一个是毕竟给出一个名称(可能在命名空间中),然后用它来声明一个构造函数。人们也可能想使用一种init()
从 的构造函数中调用的虚方法,Processor
它完成了构造函数应该做的工作。但这不起作用,因为构造函数中的虚拟调用还没有到达派生类中的方法。但是,相反,调用init()
可以隐藏在未命名类的数据成员的初始化程序中。
但是是否有任何“纯”C++ 答案,它使未命名的类保持未命名并且仍然在构造函数中完成所有事情,这应该在构造函数中完成?
解决方案
在写这个问题的时候,我已经找到了答案,所以在这里分享一下:在 C++11 中,using
扩展了关键字以允许显式导入基类的构造函数,这巧妙地解决了这个问题:
class : public Processor {
using Processor::Processor;
public:
int op(int a, int b) override { return a + b; }
} Adder { "Adder" };
所以Adder
在程序启动时正确实例化,并且命名空间不受污染。
推荐阅读
- jquery - 将 JQuery val() 转换为 ASP 表单无法识别“提交”
- powershell - 向 CSV 添加列会在第一条记录周围留下单引号
- postgresql - 数据库 SQL:如何使用 regexp_substr 从序列中提取数据?
- android - SMS Retriever API 如何获取 SMS 发件人/发件人地址
- android - Kotlin:不同片段之间的通信
- c# - C# Excel 更改单元格类型
- python - 验证准确性如何决定在 Keras 的二进制分类中哪个类是正确的?
- eclipse - 在 Eclipse 中运行 JavaFX 时出现“选择不包含主要类型”错误。
- jquery - Jquery隐藏/显示延迟
- reactjs - 使用 react-virtualized 和 InfiniteLoader 闪烁而不加载行