如何从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;

因此AdderMultiplier都成为Processor接口的单个​​派生对象。但是,如果基本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会在程序启动时正确实例化,并且使命名空间免受污染。