关于C ++中纯虚函数的问题?

时间:2011-05-01 01:58:13

标签: c++ virtual-functions

我正在阅读一些重新编写Pure Virtual Functions的C ++文本。正如文中所说,纯虚函数声明的形式是:

virtual void virtualfunctioname() = 0;

文本解释说:“由于纯虚函数没有主体,程序员必须在基类中添加符号= 0来声明纯虚函数。”

我试图删除= 0;,这意味着我只声明了virtual void virtualfunctioname();并且事情正常。

那么,为什么我们需要为虚拟函数分配0? 感谢

4 个答案:

答案 0 :(得分:2)

如果某个类具有任何纯虚函数,则无法实例化它。此外,它强制任何派生类实现这些函数,否则它们也无法实例化。

因此,如果删除= 0,您将只拥有一个可以实例化的普通基类,并且不会在其派生类上强制实施接口。如果你实例化一个基类对象(或没有覆盖的派生类对象),然后尝试在其上调用virtualfunctionname(),你就会遇到麻烦,因为它没有定义,所以链接器会抱怨。

[注意,“纯虚函数没有正文”的说法也是错误的;您可以定义纯虚拟的实现。不过,这门课仍然是抽象的。]

答案 1 :(得分:1)

如果您没有将方法声明为纯虚方法,编译器将假定某处有一个实现。如果您从未实例化应该包含那些纯虚拟的类(以及使用正确术语的抽象类),那么您将没问题。但是,如果这样做,编译器将接受该代码作为有效,稍后您将收到链接器错误。

如果将方法标记为纯虚方法,则包含它的类将被标记为抽象,编译器将拒绝任何实例化它的尝试。

答案 2 :(得分:0)

  事情很顺利

我假设您的意思是编译和链接的代码。但是,您可能尚未在声明它的基类中定义virtualfunctionname的实现,因此如果您调用基本实现,则会出现链接器错误。

目前,事情可能有效,因为您在派生类中提供了一个实现并使用它。

答案 3 :(得分:0)

当您将一个函数声明为纯虚函数时,包含它的类将被称为抽象类,并且不会创建任何实例。 同样,不会创建该类的实例。此类用于继承,派生类必须实现此方法。否则将出现编译错误。 感谢

相关问题