Search code examples
c++c++11finalvirtual-functions

final specifier has no effect with separate declaration and definition


I noticed some strange behaviour with final keyword. When I do:

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

class B : public A {
public:
    void foo() override {}
};

I get compiler error on overriding foo in B as I would expect. But when I make separate definition and declaration of A::foo

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

void A::foo() {}

class B : public A {
public:
    void foo() override {}
};

the error is gone. Is it as it should be or a compiler bug?

//edit: gcc version 4.9.2 (Debian 4.9.2-10+deb8u1)


Solution

  • Both snippets should generate a compiler error about overiding a final function. This seems like a compiler bug. gcc 4.9.2 compiles and gcc 4.9.3 generates an error.