在GCC上进行编译时,我在函数定义上得到了错误:pure-specifier,但是当我使用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
错误是什么意思?为什么我不能内联?如第二个代码示例所示,避免编译问题是否合法?
答案 0 :(得分:30)
好的,我刚刚学到了一些东西。纯虚函数必须声明如下:
class Abstract
{
public:
virtual void pure_virtual() = 0;
};
它可能有一个机构,但在声明时包含它是违法的。这意味着要拥有一个正文,必须在类之外定义纯虚函数。请注意,即使它有一个主体,该函数仍然必须被派生自Abstract
的任何具体类所覆盖。如果他们需要,他们可以选择明确地调用Abstract::pure_virtual()
。
详情为here。
答案 1 :(得分:19)
C ++标准,10.4 / 2:
函数声明不能同时提供纯指定符和定义
答案 2 :(得分:12)
此语法:
virtual void Process() = 0 {};
不是合法的C ++,但VC ++支持。究竟为什么标准不允许这一点对我来说从未如此明显。你的第二个例子是合法的。
答案 3 :(得分:4)
根据定义,C ++中的纯虚函数 在声明中没有定义。
你的第二个代码块没有避免编译器问题。它正按照预期的方式实现纯虚函数。
要问的问题是,如果您打算使用默认实现,为什么需要将其声明为纯虚拟?
答案 4 :(得分:3)
这是非常不允许的 - 可以包含 pure-specifiers 的声明符,即 member-declarator ,只出现在声明中定义。 [class.mem] :
成员声明:
的 属性说明符-SEQ <子>选择子> decl-specifier-seq opt member-declarator-list opt;
< EM>函数的定义
强> [...]member-declarator-list :
member-declarator
构件声明符列表 , member-declaratormember-declarator :
声明者 virt-specifier-seq opt pure-specifier opt
declarator brace-or-equal-initializer opt
标识符 opt attribute-specifier-seq opt:
constant-expression
function-definition 的语法不包括 pure-specifier ,[dcl.fct.def.general]:
函数的定义:
属性说明符-SEQ <子>选择子> decl-specifier-seq opt 声明者virt-specifier-seq opt function-body
答案 5 :(得分:0)
你当然可以为纯虚函数提供一个体。该抽象类vtable将指向该函数。否则,相同的插槽将指向编译器特定的陷阱功能,如GCC的__cxa_pure_virtual
。当然,标准中没有任何关于此的内容。