C++ 为什么标准不允许;虚拟void funcFoo()=0{}";?

C++ 为什么标准不允许;虚拟void funcFoo()=0{}";?,c++,pure-virtual,C++,Pure Virtual,[我找不到此问题的正确答案。如果此问题已得到回答,请向我指出正确的链接。] 我知道这样做是违法的 class Base { public: virtual void funcFoo() = 0 {} //illegal. should be defined outside the class body virtual ~Base() {} }; inline void Base::funcFoo() {} 但这在VS2008上运行良好。 我想知道为什么这是不允许的标准 在

[我找不到此问题的正确答案。如果此问题已得到回答,请向我指出正确的链接。]

我知道这样做是违法的

class Base
{
public:
    virtual void funcFoo() = 0 {}   //illegal. should be defined outside the class body
    virtual ~Base() {}
};
inline void Base::funcFoo() {}
但这在VS2008上运行良好。 我想知道为什么这是不允许的标准

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

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

void Base::funcFoo() {}

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

根据§10.4/2节的规定(在注释中)格式不正确

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

希望它能回答你的问题


现在请参考@John Dibling的第一条评论(如下),因为很遗憾,如果
“格式不正确”
不是您可以接受的答案,那么您的“为什么”问题的答案不在标准中。语言语法根本不允许它。:-

根据§10.4/2节,该节(在注释中)规定

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

希望它能回答你的问题


现在请参考@John Dibling的第一条评论(如下),因为很遗憾,如果
“格式不正确”
不是您可以接受的答案,那么您的“为什么”问题的答案不在标准中。语言语法根本不允许这样做。:-

第一个问题已经回答了——标准根本不允许这样做

第二个问题是:

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

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

void Base::funcFoo() {}
问题是什么 隐式内联和隐式内联的差异 这里是显式内联吗?问题是什么 编译器有什么不同


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

第一个问题已经回答了——标准根本不允许它

第二个问题是:

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

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

void Base::funcFoo() {}
问题是什么 隐式内联和隐式内联的差异 这里是显式内联吗?问题是什么 编译器有什么不同



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

我认为没有多少答案。它以前出现过一次(可能是在Usenet上,而不是在SO上——我不记得了),所以我看了看。我什么都没想到。据我所知,比亚恩最初就是这样设计的。虽然可以更改,但我找不到任何向委员会提出的更改建议,也找不到任何迹象表明委员会已经对其进行了辩论、讨论或审议。我的猜测是,它被认为是“足够好”的,因此没有人愿意付出太多(任何?)努力来改变它。

我认为没有太多的答案。它以前出现过一次(可能是在Usenet上,而不是在SO上——我不记得了),所以我看了看。我什么都没想到。据我所知,比亚恩最初就是这样设计的。虽然可以更改,但我找不到任何向委员会提出的更改建议,也找不到任何迹象表明委员会已经对其进行了辩论、讨论或审议。我的猜测是,它被认为是“足够好”的,因此没有人愿意付出太多(任何?)努力来改变它。

这与Android有什么关系?
=0{}
的意思是“纯。不纯。嗯……空!”@commonware我认为Android NDK使用了gcc的一些变体。我发现如果我不为函数定义内联,它就不会编译。@Andrey:纯虚拟函数可以有一个实现;它们实际上不能被调用,必须被重写。问题是,当其他风格的成员函数不需要这个定义时,为什么这个定义必须在类定义之外?这与Android有什么关系?
=0{}
的意思是“Pure.Not Pure.Hmm…empty!”@commonware我认为Android NDK使用了gcc的一些变体。我发现如果我不为函数定义内联,它就不会编译。@Andrey:纯虚拟函数可以有一个实现;它们实际上不能被调用,必须被重写。问题是,当其他类型的成员函数不需要这个定义时,为什么这个定义必须在类定义之外?+1如果你想知道为什么不允许这个定义,那么这几乎就是它的全部。如果你问为什么标准作者决定制定这一规则,那么,这是另一个节目的故事…@Nawaz,我知道第10.4/2节,我真的想知道为什么这是不允许的。@Vink-没有明确的原因,只是它不是语言语法的一部分。:-)
=0
{}
不会出现在同一个产品中。我认为有一种方法可以说“强制派生类重写该方法,但仍然包含一个基本实现”?如果不是这样,那是什么?@马克:这是一种方法;但必须将函数定义放在类定义之外。我不知道为什么会这样,除了“因为标准上这么说”。+1如果你问为什么不允许这样做,这几乎就是它的全部。如果你问为什么标准作者决定制定这一规则,那么,这是另一个节目的故事…@Nawaz,我知道第10.4/2节,我真的想知道为什么这是不允许的。@Vink-没有明确的原因,只是它不是语言语法的一部分。:-)
=0