【问题标题】:How to call a non-default parent constructor from an unnamed derived class in C++?如何从 C++ 中的未命名派生类调用非默认父构造函数?
【发布时间】:2020-12-12 04:41:09
【问题描述】:

在 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++ inheritance constructor default-constructor unnamed-class


    【解决方案1】:

    在写这个问题的时候,我已经找到了答案,所以我在这里分享一下:在 C++11 中,using 关键字被扩展为允许显式导入基类的构造函数,这就解决了问题整齐:

    class : public Processor {
    using Processor::Processor;
    public:
        int op(int a, int b) override { return a + b; }
    } Adder { "Adder" };
    

    所以Adder 在程序启动时被正确实例化,并且命名空间不受污染。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 2014-12-19
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多