为什么标准不允许“virtual void funcFoo()= 0 {}”?

时间:2011-04-19 20:30:05

标签: c++ pure-virtual

[我找不到合适的答案。如果已经回答,请指出正确的链接。]

我知道做这样的事情是违法的,

class Base
{
public:
    virtual void funcFoo() = 0 {}   //illegal. should be defined outside the class body
    virtual ~Base() {}
};

但这在VS2008上运行良好。 我想知道为什么标准不允许这样做?

在Android上,我看到必须定义函数内嵌,就像这样,

inline void Base::funcFoo() {}

而不仅仅是,

void Base::funcFoo() {}

这里隐式内联和显式内联的区别是什么?什么是编译器做的不同?

3 个答案:

答案 0 :(得分:4)

根据§10.4/ 2节(在说明中)说,

这是不正确的
  

函数声明不能​​同时提供纯指定符和定义

[Example:

struct C {
   virtual void f() = 0 { }; // ill-formed
};

—end example]

希望它能回答你的问题。

现在请参考@John Dibling的第一条评论(下面),遗憾的是,您的“为什么”问题的答案不在标准中,如果"that is ill-formed"不是您可接受的答案。语言语法根本不允许它。: - )

答案 1 :(得分:1)

我认为对此没有太多答案。它曾经出现过一次(可能是在Usenet而不是SO - 我不记得了),所以我做了一些寻找。我并没有真正想出任何东西。据我所知,这就是Bjarne最初设计的方式。虽然可以改变,但我找不到委员会提出的任何改变建议,也没有任何迹象表明委员会甚至根本没有辩论,讨论或考虑过。我的猜测是它被认为是“足够好”,所以没有人愿意投入太多(任何?)努力来改变它。

答案 2 :(得分:0)

第一个问题已经得到解答 - 标准只是不允许它。

第二个问题是:

  

在android上,我看到我必须这样做   像这样定义函数内联,

inline void Base::funcFoo() {}
  

而不仅仅是,

void Base::funcFoo() {}
  是什么?   隐式内联和差异的差异   在这里明确内联?是什么   编译器做的不同吗?

不同之处在于第一个变体可以放在头文件中,头文件可以包含在多个源文件中。第二个变体必须放在一个源文件中。