final is also a specifier which used in two contexts:
- To make the virtual function final, i.e. once the virtual function is made final, it can’t be override in the derived class.
- 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.