我们总是将纯虚函数声明为:
virtual void fun () = 0 ;
也就是说,它总是被赋值为0。
我的理解是,这是将此函数的虚函数表入口初始化为NULL,而在这里使用任何其他值都会导致编译时错误。我的理解是否正确?
我们总是将纯虚函数声明为:
virtual void fun () = 0 ;
也就是说,它总是被赋值为0。
我的理解是,这是将此函数的虚函数表入口初始化为NULL,而在这里使用任何其他值都会导致编译时错误。我的理解是否正确?
使用=0
的原因是Bjarne Stroustrup当时认为他无法获得另一个关键字,例如“pure”,通过C++社区来实现该功能。这在他的书The Design & Evolution of C++第13.2.3节中有描述:
选择好奇的=0语法的原因是... 因为当时我看不到 获得新关键字的机会。
他还明确指出,这不需要将vtable条目设置为NULL,并且这样做并不是实现纯虚函数的最佳方法。
选择奇怪的
=0
语法而不是引入新的关键字pure
或abstract
的显而易见的替代方案,因为我当时认为没有机会让新的关键字被接受。如果我建议pure
,Release 2.0将在没有抽象类的情况下发货。在优雅的语法和抽象类之间做出选择,我选择了抽象类。我使用传统的C和C++约定,使用0来表示“不存在”,而不是冒着延迟风险并引起关于pure
的争论。=0
语法符合我的观点,即函数体是函数的初始化器,也符合虚拟函数集通常视为函数指针向量的(简单但通常足够的)观点。 [...]
1§13.2.3 语法
《C++标准》第9.2节给出了类成员的语法。其中包括这个产生式:
pure-specifier:
= 0
值本身并没有什么特别之处。"= 0" 只是表示 "这个函数是纯虚函数" 的语法。它与初始化、空指针或数字值零无关,尽管与这些东西的相似之处可能有助于记忆。
= 0
。你还想知道什么吗?这与问为什么函数体要用{}括起来是一样的。答案是,因为这是C++语法定义的方式。 - mloskot我不确定这是否有任何意义。 这只是语言的句法。
C++一直回避引入新的关键字,因为新的保留字会破坏使用这些单词作为标识符的旧程序。它经常被视为语言的一个优点,尽可能地尊重旧代码。
= 0
语法确实可能被选择,因为它类似于将vtable条目设置为0
,但这纯粹是象征性的。(大多数编译器将此类vtable条目分配给一个发出错误并终止程序的存根。)这种语法主要是因为它以前没有被用过,而且它避免了引入新的关键字。
pure
关键字会非常好。无论如何,理解其背后的原理是很好的事情。 - Keith Pinson#define pure = 0
。 - jdh8:-)
- sbiC++必须有一种方法来区分纯虚函数和普通虚函数的声明。他们选择使用“= 0”语法。他们也可以通过添加pure关键字来实现相同的功能,但是C++并不喜欢添加新的关键字,更喜欢使用其他机制来引入特性。
在这种情况下,没有任何东西被“初始化”或“赋值”为零。 = 0
只是由 =
和 0
标记组成的语法结构,与初始化或赋值完全无关。
它与“vtable”中的任何实际值都没有关系。C++语言没有“vtable”或类似的概念。各种“vtable”只不过是特定实现的细节而已。
我认为这只是C++语法的一部分。我不认为编译器在特定的二进制格式中实现这个有任何限制。对于早期的C++编译器,你的想法可能是正确的。
= 0
声明了一个纯虚函数。
我理解的是,这是为了将此函数的vtable条目初始化为NULL,而在此处使用任何其他值会导致编译时错误。
我认为这不是真的。这只是一种特殊的语法。vtable是实现定义的。没有人说必须在构造时实际将纯成员的vtable条目清零(尽管大多数编译器处理vtable类似)。
= 0
的唯一作用是使整个类变为抽象类并禁止对纯函数进行虚拟调用。非虚拟调用仍然完全没问题,当你提供了定义时就会使用它。 - AnT stands with Russia__cxa_pure_virtual
https://arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/abstract_classes.html 替换了 Base::f() 的条目。 - Lewis Kelsey
virtual void func() = 100;
会发生什么? - krithikaGopalakrishnan