纯虚函数是那些虚函数并且具有纯说明符 ( = 0;
)
第 10.4 条第 2 款C++03 的内容告诉我们什么是抽象类,顺便说一句,如下:
[注意:函数声明不能同时提供纯说明符和定义
——尾注] [示例:
struct C {
virtual void f() = 0 { }; // ill-formed
};
—结束示例]
对于那些不太熟悉这个问题的人,请注意纯虚函数可以有定义但上述子句禁止此类定义出现内联(词汇上的类内)。 (对于定义纯虚函数的用途,您可能会看到,例如,这得到了 http://www.gotw.ca/gotw/031.htm)
现在,对于所有其他种类和类型的函数,都可以提供类内定义,并且这种限制乍一看绝对是人为且难以解释的。想想看,第二眼和后来的目光似乎都是如此:)但我相信,如果没有特定的原因,这种限制就不会存在。
我的问题是:有人吗know具体有那些原因呢?Good也欢迎大家猜测。
Notes:
- MSVC 确实允许 PVF 具有内联定义。所以不要感到惊讶:)
- 这个单词
inline
在这个问题中没有提到inline关键词。应该是这个意思词汇上的类内
在SO线程中“为什么纯虚函数初始化为0?” /questions/2156634/why-is-a-pure-virtual-function-initialized-by-0Jerry Coffin 提供了 Bjarne Stroustrup 的这句话C++ 的设计与演变 //www.stroustrup.com/dne.html,第 §13.2.3 节,我在其中添加了一些我认为相关的部分的强调:
好奇的=0
选择语法而不是引入新关键字 pure 或 Abstract 的明显替代方案,因为当时我认为没有机会接受新关键字。如果我建议使用 pure,那么 Release 2.0 就不会附带抽象类。如果要在更好的语法和抽象类之间进行选择,我选择了抽象类。我没有冒延迟的风险,也没有因纯粹而引发某些争论,而是使用了传统的 C 和 C++ 约定,即使用 0 来表示“不存在”。这=0
语法适合我认为函数体是函数的初始化器以及作为函数指针向量实现的虚拟函数集的(简单但通常足够)视图。 [……]
因此,在选择语法时,Bjarne 将函数体视为声明器的一种初始化器部分,并且=0
作为初始化程序的另一种形式,表示“没有主体”(或者用他的话说,“不在那里”)。
按理说,在那个概念图景中,一个人不可能既表示“不在那里”又拥有一个身体。
或者,仍然在那个概念图中,有两个初始化程序。
现在,这就是我的心灵感应能力、google-foo 和软推理能力。我猜想没有人有足够的兴趣™向委员会提出一项关于取消这种纯粹语法限制的提案,并跟进所需的所有工作。所以现在还是这样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)