在GCC上编译时,我得到错误:函数定义上的纯说明符,但是当我使用VS2005编译同一代码时却没有。
class Dummy {
//error: pure-specifier on function-definition, VS2005 compiles
virtual void Process() = 0 {};
};
但是当此纯虚函数的定义不是内联时,它将起作用:
class Dummy
{
virtual void Process() = 0;
};
void Dummy::Process()
{} //compiles on both GCC and VS2005
错误是什么意思?为什么我不能内联?逃避第二个代码示例中所示的编译问题是否合法?
好吧,我刚刚学到了一些东西。纯虚函数必须声明如下:
class Abstract
{
public:
virtual void pure_virtual() = 0;
};
它可能有一个尸体,尽管在声明时将其包括在内是非法的。这意味着要具有主体,必须在类外部定义纯虚函数。请注意,即使它具有主体,该函数仍必须被从Abstract
派生的任何具体类覆盖。如果需要,他们可以选择显式调用Abstract::pure_virtual()
。
详细信息是here。
C ++标准,10.4 / 2:
函数声明不能同时提供纯说明符和定义
此语法:
virtual void Process() = 0 {};
不是合法的C ++,但VC ++支持。确切为什么标准不允许这样做对我来说从来都不是显而易见的。您的第二个例子是合法的。
根据定义,纯虚拟函数在C ++中没有定义在声明中。
您的第二个代码块无法避免编译器问题。它正在按预期的方式实现纯虚函数。
要问的问题是,如果要使用默认实现,为什么需要将其声明为纯虚拟的?
这在语法上是不允许的-可以包含pure-specifiers的声明符,即<< [member-declarator仅出现在不是定义的声明中。 [class.mem]:
:成员声明
;
[function-definition][...]member-declarator-list:<< [member-declarator成员声明者列表,成员声明者
member-declarator:<<pure-specifier
opt声明符大括号或等于初始化器 optidentifier opt attribute-specifier-seq opt:
constant-expressionfunction-definition的语法不包括pure-specifier,[dcl.fct.def.general]:function-definition
:<< [attribute-specifier-seqoptopt function-bodydeclarator virt-specifier-seq