为什么一个纯粹的虚拟函数被0初始化?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

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

virtual void fun () = 0 ;

也就是说,它总是被赋值为0。

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

提问于
用户回答回答于

原因=0在于Bjarne Stroustrup认为他没有获得另一个关键字,比如在实现该功能时通过C ++社区的“纯粹”。这在他的书“ The Design&Evolution of C ++ ”第13.2.3节中有描述:

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

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

用户回答回答于

与C ++设计的大多数“为什么”问题一样,首先看的是Bjarne Stroustrup 1 的C ++的设计和演化

奇怪的=0语法选择了引入新关键字的明显选择,pure或者 abstract因为当时我看不到接受新关键字的机会。如果我建议pure,发布2.0将没有抽象类发布。鉴于更好的语法和抽象类之间的选择,我选择了抽象类。我没有冒险延迟并招致某些战斗 pure,而是使用传统的C和C ++约定来使用0来表示“不存在”。这个=0语法符合我的观点,即函数体是函数的初始化方法,它也具有(作为函数指针向量实现的)虚拟函数集的(简单的,但通常是足够的)视图。[...]

1 §13.2.3语法

扫码关注云+社区