C++ 最终说明符对单独的声明和定义无效

C++ 最终说明符对单独的声明和定义无效,c++,c++11,final,virtual-functions,C++,C++11,Final,Virtual Functions,我注意到final关键字有一些奇怪的行为。当我这样做时: class A { public: virtual ~A() = default; virtual void foo() final {} }; class B : public A { public: void foo() override {} }; 正如我预期的那样,我在B中重写foo时遇到编译器错误。但是当我对A::foo进行单独的定义和声明时 class A { public: virtual

我注意到
final
关键字有一些奇怪的行为。当我这样做时:

class A {
public:
    virtual ~A() = default;
    virtual void foo() final {}
};

class B : public A {
public:
    void foo() override {}
};
正如我预期的那样,我在
B
中重写
foo
时遇到编译器错误。但是当我对A::foo进行单独的定义和声明时

class A {
public:
    virtual ~A() = default;
    virtual void foo() final;
};

void A::foo() {}

class B : public A {
public:
    void foo() override {}
};
错误消失了。它是应该的还是一个编译器错误


//编辑:gcc版本4.9.2(Debian 4.9.2-10+deb8u1)

这两个代码段都会生成一个编译器错误,该错误会覆盖
final
函数。这似乎是一个编译器错误。编译并生成错误。

为什么不检查发行说明?这些都是g++的旧版本。@FrançoisAndrieux我相信这就是答案。如果你发帖子,我会投票!第二个代码段中也有a
B
吗?@ÖTiib这是我能在Debian 8.1上获得的最新稳定版本。我认为B显然也属于第二个代码段。@PKua这似乎很明显,但问题是在评论中提出的。我花了好几次通读,才推断出
B
被认为是第二段的一部分。我清楚地陈述了这是为了避免任何混乱的假设。