为什么纯虚函数初始化为0?

muk*_*mar 145 c++ abstract-class pure-virtual

我们总是声明一个纯虚函数:

virtual void fun () = 0 ;
Run Code Online (Sandbox Code Playgroud)

即,它总是被赋值为0.

我的理解是,这是将此函数的vtable条目初始化为NULL,此处的任何其他值都会导致编译时错误.这种理解是否正确?

小智 160

使用的原因=0是Bjarne Stroustrup不认为他可以获得另一个关键字,例如在实现该功能时通过C++社区的"纯粹".这在他的书"C++的设计与演变"第13.2.3节中有所描述:

选择好奇的= 0语法...因为当时我看不到接受新关键字的机会.

他还明确指出,这不需要将vtable条目设置为NULL,这样做并不是实现纯虚函数的最佳方法.

  • 请上帝让我远离那些项目:-) (77认同)
  • 它比#define BEGIN {#define END} ;-)差很多,有时我也见过. (27认同)
  • 因此,换句话说,Bjarne"面临最后期限"和"使用黑客"来克服"设计缺陷";)(只是面对面) (18认同)
  • 这种漂亮的东西让我觉得C++不是很精致.考虑到它的使用如此之多,这很奇怪.我希望随着时间的流逝语言会更好. (5认同)
  • 是的,这只是语法.我见过很多#define PURE = 0的项目,他们会说virtual void Foo()PURE; (4认同)

Jer*_*fin 76

与大多数关于C++设计的"为什么"问题一样,首先要看的是C++的设计和演变,作者:Bjarne Stroustrup 1:

=0选择好奇的语法而不是引入新关键字的明显替代方案,pure或者 abstract因为当时我没有看到接受新关键字的机会.如果我建议pure,版本2.0将没有抽象类.给出了更好的语法和抽象类之间的选择,我选择了抽象类.pure我使用传统的C和C++惯例,使用0表示"不存在",而不是冒着延迟和发生某些争斗的风险 .该=0语法与我的观点,即一个功能体为功能也与所述一组虚拟功能的(简单,但通常是足够的)视图被实现为函数指针的向量初始化拟合.[...]

1 §13.2.3语法


Kri*_*son 29

C++标准的9.2节给出了类成员的语法.它包括这个产品:

pure-specifier:
    = 0
Run Code Online (Sandbox Code Playgroud)

价值没有什么特别之处."= 0"只是说"此函数是纯虚拟"的语法.它与初始化或空指针或数值零无关,尽管与这些事物的相似性可能具有助记符值.

  • @mloskot:也许是因为它没有回答OP的问题,只是重申一下情况? (7认同)
  • @just somebody - 它包括标准引文,它说明了纯虚函数声明的语法是什么,语法使用pure-specifier` = 0.你还想知道什么?这就像问为什么函数体被{}包裹一样.答案就是,因为这就是C++语法定义的内容. (6认同)
  • +1表示参考C++标准.这是一个令人惊讶的最好的答案之一,到目前为止只有1票.阅读标准应该是解决C++问题的第一步. (5认同)

cqu*_*len 19

我不确定这背后是否有任何意义.它只是语言的语法.


sbi*_*sbi 15

C++一直避免引入新的关键词,因为新的保留词会破坏使用这些词作为标识符的旧程序.它通常被视为语言的优势之一,它尽可能地尊重旧代码.

= 0可能确实已选择语法,因为它酷似设置虚函数表条目0,但是这纯粹是象征性的.(大多数编译器将这样的vtable条目分配给存根,该存根在中止程序之前发出错误.)语法主要被选择,因为它之前没有用于任何东西,它保存了引入新关键字.

  • +1用于解释引入新关键字的缺点.这有助于理解基本原理,但C++语法对我来说似乎很荒谬,我希望它们能让它更具人性化 - 在我的书中,一个"纯"的关键字本来就很棒.无论如何,理解其基本原理是件好事. (3认同)

Jar*_*Par 11

C++必须有一种方法来区分纯虚函数和普通虚函数的声明.他们选择使用= 0语法.他们可以通过添加纯关键字轻松完成相同的操作.但是C++非常不愿意添加新关键字并且更喜欢使用其他机制来引入功能.

  • -0:如果你自己没有什么可说的话,请使用广泛的引用(参见Jerry Coffin对+1的回答;) (2认同)

AnT*_*AnT 7

在这种情况下,没有任何东西被"初始化"或"分配"为零.= 0只是一个由=0令牌组成的语法结构,它与初始化或赋值完全没有关系.

它与"vtable"中的任何实际值无关.C++语言没有"vtable"或类似的任何概念.各种"vtable"只不过是具体实现的细节.