【发布时间】:2012-12-08 23:50:23
【问题描述】:
我想创建一个名为“Node”的空基类,然后从它派生其他类,例如“DecisionNode”和“Leaf”。这样做是有意义的,因此我可以利用多态性将这些不同类型的节点传递给方法,而无需在编译时知道将传递给方法的内容,但是每个派生类不共享任何状态或方法。
我认为实现这一点的最佳方法是使构造函数成为纯虚拟,而不在基类中创建额外的纯虚拟方法,这会增加混乱。因此,在该类的头文件“Node.h”中,我写道:
class Node {
private:
virtual Node();
};
我在“Node.cpp”中写道:
#include "Node.h"
virtual Node::Node() = 0;
此实现防止 Node 被另一个类实例化,因为唯一的构造函数是私有的,并且使用纯虚拟说明符来指示该类是抽象的。但是,这会导致编译器错误:
Node.h:6:21: error: return type specification for constructor invalid
Node.h:6:21: error: constructors cannot be declared virtual [-fpermissive]
我的问题是:有没有一种巧妙的方法来制作一个空的抽象基类?
【问题讨论】:
-
使用虚拟析构函数,无论如何你都应该这样做。
-
如果没有节点共享方法,你实际上打算如何使用节点?
-
stackoverflow.com/questions/9588788/… 在问题中有一个 ABC 实现。
-
@WaleedKhan:在方法签名中,所以我可以传入任何从 Node 派生的类。
-
@Froskoy,如果他们不共享代码并且没有任何虚拟方法,那么传递
Node*并不比传递void*好 - 在这两种情况下,您都必须转换为来回特定的类。
标签: c++ inheritance constructor polymorphism abstract-class