final is also a specifier which used in two contexts:

  1. To make the virtual function final, i.e. once the virtual function is made final, it can’t be override in the derived class.
  2. To make the class final, i.e. no other class can be derived from final class.

Making virtual function final

#include <iostream>
 
class Base
{
public:
    virtual void msg(int a)
    {
        std::cout << "From base " << a << '\n';
    }
};
 
class Derived : public Base
{
public:
    void msg(int a) override final
    {
        std::cout << "From derived " << a << '\n';
    }
};
 
class Derived2 : public Derived
{
public:
    void msg(int a) override
    {
        std::cout << "From derived2 " << a << '\n';
    }
};

Here, msg virtual function is marked as final so when overriding in class Derived2 gives a compilation error.

Making class final

Similarly we can make a class final:

#include <iostream>
 
class Base final
{
};
 
class Derived : public Base
{
};

This would give compilation error saying can’t derive from final class Base.

References

  1. https://www.learncpp.com/cpp-tutorial/the-override-and-final-specifiers-and-covariant-return-types/