C++ final Specifier

Last Updated : 23 Jul, 2025

In Java, we can use final for a function to make sure that it cannot be overridden. We can also use final in Java to make sure that a class cannot be inherited. Similarly, the latest C++ standard C++ 11 added final. 

Use of final specifier in C++ 11: 

Sometimes you don’t want to allow derived class to override the base class virtual function. C++ 11 allows built-in facility to prevent overriding of virtual function using final specifier. 

Consider the following example which shows use of final specifier. This program fails in compilation. 

CPP
#include <iostream>
using namespace std;

class Base
{
public:
    virtual void myfun() final
    {
        cout << "myfun() in Base";
    }
};
class Derived : public Base
{
    void myfun()
    {
        cout << "myfun() in Derived\n";
    }
};

int main()
{
    Derived d;
    Base &b = d;
    b.myfun();
    return 0;
}


Output:

prog.cpp:14:10: error: virtual function ‘virtual void Derived::myfun()’
void myfun()
^
prog.cpp:7:18: error: overriding final function ‘virtual void Base::myfun()’
virtual void myfun() final

Note: In C++, final specifier cannot be used with non-virtual functions.

2nd use of final specifier:

final specifier in C++ 11 can also be used to prevent inheritance of class / struct. If a class or struct is marked as final then it becomes non inheritable and it cannot be used as base class/struct. 

The following program shows use of final specifier to make class non inheritable: 

CPP
#include <iostream>
class Base final
{
};

class Derived : public Base
{
};

int main()
{
    Derived d;
    return 0;
}


Output

error: cannot derive from ‘final’ base ‘Base’ in derived type ‘Derived’
class Derived : public Base

final in C++ 11 vs in Java 

Note that use of final specifier in C++ 11 is same as in Java but Java uses final before the class name while final specifier is used after the class name in C++ 11. Same way Java uses final keyword in the beginning of method definition (Before the return type of method) but C++ 11 uses final specifier after the function name.

CPP
class Test
{
    final void fun()// use of final in Java
    { }
}
class Test
{
public:
    virtual void fun() final //use of final in C++ 11
    {}
};

Unlike Java, final is not a keyword in C++ 11. final has meaning only when used in above contexts, otherwise it's just an identifier. 

One possible reason to not make final a keyword is to ensure backward compatibility. There may exist production codes which use final for other purposes. For example, the following program compiles and runs without error. 

CPP
#include <iostream>
using namespace std;

int main()
{
    int final = 20;
    cout << final;
    return 0;
}

Output: 

20

In java, final can also be used with variables to make sure that a value can only be assigned once. this use of final is not there in C++ 11.

Comment