Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C+;中未命名的派生类调用非默认父构造函数+;? 在C++中,如果直接创建对象,则可以声明未使用的单用结构和类: struct { int x; int y; } point;_C++_Inheritance_Constructor_Default Constructor_Unnamed Class - Fatal编程技术网

如何从C+;中未命名的派生类调用非默认父构造函数+;? 在C++中,如果直接创建对象,则可以声明未使用的单用结构和类: struct { int x; int y; } point;

如何从C+;中未命名的派生类调用非默认父构造函数+;? 在C++中,如果直接创建对象,则可以声明未使用的单用结构和类: struct { int x; int y; } point;,c++,inheritance,constructor,default-constructor,unnamed-class,C++,Inheritance,Constructor,Default Constructor,Unnamed Class,未命名的类也可以从基类继承。例如,这对于从基本处理器接口创建不同“处理器”的列表非常有用。这里有一个简单的例子: 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; }

未命名的类也可以从基类继承。例如,这对于从基本处理器接口创建不同“处理器”的列表非常有用。这里有一个简单的例子:

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;
因此,
加法器
乘法器
都成为
处理器
接口的单一派生对象。但是,如果基础处理器有更多的结构和构造函数,那么需要参数吗?让我们看看这个例子:

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()
方法,该方法是从
处理器的构造函数调用的,它完成了构造函数应该完成的工作。但这不起作用,因为构造函数中的虚拟调用尚未到达派生类中的方法。但是,对
init()
的调用可以隐藏在未命名类的数据成员的初始值设定项中


但是,是否存在“纯”C++答案,它使未命名类保持未命名,仍然在构造函数中做所有的事情,应该在构造函数中完成?

< p>。在编写这个问题时,我已经找到答案,所以我将在这里分享:C++ 11,扩展了
using
关键字,允许显式导入基类的构造函数,这很好地解决了问题:

class : public Processor {
using Processor::Processor;
public:
    int op(int a, int b) override { return a + b; }
} Adder { "Adder" };
因此,
Adder
在程序启动时被正确实例化,并且名称空间不会受到污染