我正在阅读一些重新编写Pure Virtual Functions的C ++文本。正如文中所说,纯虚函数声明的形式是:
virtual void virtualfunctioname() = 0;
文本解释说:“由于纯虚函数没有主体,程序员必须在基类中添加符号= 0来声明纯虚函数。”
我试图删除= 0;
,这意味着我只声明了virtual void virtualfunctioname();
并且事情正常。
那么,为什么我们需要为虚拟函数分配0? 感谢
答案 0 :(得分:2)
如果某个类具有任何纯虚函数,则无法实例化它。此外,它强制任何派生类实现这些函数,否则它们也无法实例化。
因此,如果删除= 0
,您将只拥有一个可以实例化的普通基类,并且不会在其派生类上强制实施接口。如果你实例化一个基类对象(或没有覆盖的派生类对象),然后尝试在其上调用virtualfunctionname()
,你就会遇到麻烦,因为它没有定义,所以链接器会抱怨。
[注意,“纯虚函数没有正文”的说法也是错误的;您可以定义纯虚拟的实现。不过,这门课仍然是抽象的。]
答案 1 :(得分:1)
如果您没有将方法声明为纯虚方法,编译器将假定某处有一个实现。如果您从未实例化应该包含那些纯虚拟的类(以及使用正确术语的抽象类),那么您将没问题。但是,如果这样做,编译器将接受该代码作为有效,稍后您将收到链接器错误。
如果将方法标记为纯虚方法,则包含它的类将被标记为抽象,编译器将拒绝任何实例化它的尝试。
答案 2 :(得分:0)
事情很顺利
我假设您的意思是编译和链接的代码。但是,您可能尚未在声明它的基类中定义virtualfunctionname
的实现,因此如果您调用基本实现,则会出现链接器错误。
目前,事情可能有效,因为您在派生类中提供了一个实现并使用它。
答案 3 :(得分:0)
当您将一个函数声明为纯虚函数时,包含它的类将被称为抽象类,并且不会创建任何实例。 同样,不会创建该类的实例。此类用于继承,派生类必须实现此方法。否则将出现编译错误。 感谢