此声明的= 0
部分意味着什么?
class KeyboardListener
{
public:
virtual bool keyPressed(void) = 0;
}
答案 0 :(得分:6)
这意味着成员函数是纯虚拟,这意味着它根本没有实现。因此,该类无法实例化(它变为“抽象”),并且它只能用作基类,其派生类必须(最终)实现虚拟成员函数。
一个示例是带有纯虚拟成员函数Animal
的抽象feed()
类:由于每个动物总是具体(即派生)动物的实例,因此不存在纯粹的抽象动物。虽然动物有一些喂食方式,但每种动物都没有通用的基本实施方法 - 我们只知道feed()
存在,但必须始终由具体的衍生动物具体实施。
(注意你可以实际提供纯虚函数的实现。你仍然无法实例化这样的类,但派生类可以调用基函数。这很少见有用且可能很差的风格。)
答案 1 :(得分:1)
这就是所谓的“纯虚函数”,它是如何构造抽象类的。有关详细信息,请参阅the wikipedia article。
要使用您的示例,在KeyboardListener
类中,keyPressed(void)
函数已声明但未实现 - 也就是说,它被视为接口的一部分,并且子类应该实现该函数*,但是父类本身不。不能创建父类的实例 - 父类只能用作指向完全定义的子类的实例的指针。
*话虽如此,子类不是必需的来实现它 - 但是如果它们没有,你就无法实例化那些的子类,只有它们的最终实现keyPressed(void)
的后代。
答案 2 :(得分:1)
你必须在派生类中实现这个功能,它是纯虚拟(如名称所示)并且没有实现(由零隐含, = 0 )(有些情况下他们可以实现)。具有纯虚函数的类称为抽象基类等。它们无法实例化。
要使用它们,您必须提取抽象类并在派生类中实现纯虚方法。
答案 3 :(得分:1)
= 0表示函数为纯虚拟,而不是普通虚拟。 = 0将函数体定义为派生类。
这种区别使得包含纯虚拟函数的类成为抽象一个无法实例化的类,只能扩展到一个合适的类,只要纯虚拟功能被赋予一个体。这通常与纯虚拟析构函数一起使用,因为每个派生类都会自动提供默认的析构函数。
来自https://stackoverflow.com/a/1219618/866333:
注意:析构函数是唯一的方法,即使它是纯虚拟的,也必须有一个实现,以便它定义的类是有用的(是纯虚函数可以有实现)。