函数定义的纯粹说明符

时间:2010-06-01 15:56:11

标签: c++ abstract-class pure-virtual

在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

错误是什么意思?为什么我不能内联?如第二个代码示例所示,避免编译问题是否合法?

6 个答案:

答案 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-declarator

     

member-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。当然,标准中没有任何关于此的内容。