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,这样做并不是实现纯虚函数的最佳方法.
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"只是说"此函数是纯虚拟"的语法.它与初始化或空指针或数值零无关,尽管与这些事物的相似性可能具有助记符值.
sbi*_*sbi 15
C++一直避免引入新的关键词,因为新的保留词会破坏使用这些词作为标识符的旧程序.它通常被视为语言的优势之一,它尽可能地尊重旧代码.
在= 0可能确实已选择语法,因为它酷似设置虚函数表条目0,但是这纯粹是象征性的.(大多数编译器将这样的vtable条目分配给存根,该存根在中止程序之前发出错误.)语法主要被选择,因为它之前没有用于任何东西,它保存了引入新关键字.
Jar*_*Par 11
C++必须有一种方法来区分纯虚函数和普通虚函数的声明.他们选择使用= 0语法.他们可以通过添加纯关键字轻松完成相同的操作.但是C++非常不愿意添加新关键字并且更喜欢使用其他机制来引入功能.
在这种情况下,没有任何东西被"初始化"或"分配"为零.= 0只是一个由=和0令牌组成的语法结构,它与初始化或赋值完全没有关系.
它与"vtable"中的任何实际值无关.C++语言没有"vtable"或类似的任何概念.各种"vtable"只不过是具体实现的细节.