从C++中的空基类继承

Fro*_*koy 5 c++ polymorphism inheritance constructor abstract-class

我想创建一个名为"Node"的空基类,然后从其中派生出其他类,如"DecisionNode"和"Leaf".这样做是有意义的,这样我就可以利用多态将这些不同类型的节点传递给方法,而不必在编译时知道将传递给方法的内容,但每个派生类不共享任何状态或方法.

我认为实现这个的最好方法是,不在基类中创建额外的纯虚方法,这会增加混乱,这将使构造函数变为纯虚拟.在该类的头文件中,"Node.h"因此我写道:

class Node {
 private:
  virtual Node();
};
Run Code Online (Sandbox Code Playgroud)

在"Node.cpp"我写道:

#include "Node.h"
virtual Node::Node() = 0;
Run Code Online (Sandbox Code Playgroud)

此实现防止Node被另一个类实例化,因为唯一的构造函数是private,并使用纯虚拟说明符来指示该类是抽象的.但是,这会给编译器错误:

Node.h:6:21: error: return type specification for constructor invalid
Node.h:6:21: error: constructors cannot be declared virtual [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

我的问题是:有一个简洁的方法来创建一个空的抽象基类?

Mar*_*ius 7

你不能使构造函数虚拟化.如果不需要其他纯虚函数,则可以使析构函数为纯虚拟:

class Node
{
public:
    virtual ~Node() = 0;
};

Node::~Node()
{
  // Compulsory virtual destructor definition,
  // even if it's empty
}
Run Code Online (Sandbox Code Playgroud)


bil*_*llz 6

C++不支持虚拟构造函数.

§12.1构造函数

12.1.4构造函数不应为虚拟(10.3)或静态(9.4).

下面的代码不会编译:

virtual Node::Node() = 0;
Run Code Online (Sandbox Code Playgroud)

我的问题是:有一个简洁的方法来创建一个空的抽象基类?

是的,使析构函数成为纯虚函数,还提供析构函数定义

class Node 
{
public:
    virtual ~Node()=0
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,至少不适用于g ++.您必须在类定义之外提供构造函数的定义. (2认同)