C++11coreintermediate
Final Specifier (C++11 Addition)
C++11 · Modern Revolution · Compiler flag: -std=c++11
Explanation
Prevents class inheritance or function overriding for safety.
Real-World Scenario
Lock a critical class in a security system.
Quick Snippet
snippet.cpp
class Secure final {};Full Example
final_specifier.cpp
// CodeNebula - C++11 Example: final Keyword
// Compile: g++ -std=c++11 -Wall -Wextra -o example final_specifier.cpp
// Demonstrates the 'final' specifier for classes and virtual methods.
// 'final' on a class prevents inheritance; on a method, prevents further
// overriding. This enforces design intent and can enable compiler optimizations.
#include <iostream>
#include <string>
#include <memory>
// ------------------------------------------------------------------
// 1. final on virtual methods
// ------------------------------------------------------------------
class Animal {
public:
virtual std::string speak() const = 0;
virtual std::string type() const { return "Animal"; }
virtual ~Animal() = default;
};
class Dog : public Animal {
public:
// Override and mark final: no further overriding allowed
std::string speak() const override final
{
return "Woof!";
}
std::string type() const override
{
return "Dog";
}
};
class GoldenRetriever : public Dog {
public:
// speak() cannot be overridden here (it's final in Dog)
// std::string speak() const override { return "Bark!"; } // ERROR!
// type() can still be overridden (not final)
std::string type() const override
{
return "Golden Retriever";
}
};
// ------------------------------------------------------------------
// 2. final on classes (prevents inheritance)
// ------------------------------------------------------------------
class Singleton final {
static Singleton* instance_;
int value_;
Singleton(int v) : value_(v) {}
public:
static Singleton& instance(int v = 0)
{
if (!instance_) {
instance_ = new Singleton(v);
}
return *instance_;
}
int value() const { return value_; }
void setValue(int v) { value_ = v; }
};
Singleton* Singleton::instance_ = nullptr;
// class DerivedSingleton : public Singleton {}; // ERROR: Singleton is final
// ------------------------------------------------------------------
// 3. final in a class hierarchy
// ------------------------------------------------------------------
class Base {
public:
virtual void process() const
{
std::cout << " Base::process" << std::endl;
}
virtual void validate() const
{
std::cout << " Base::validate" << std::endl;
}
virtual ~Base() = default;
};
class Middle : public Base {
public:
void process() const override final // sealed: no further override
{
std::cout << " Middle::process (final)" << std::endl;
}
void validate() const override // still overridable
{
std::cout << " Middle::validate" << std::endl;
}
};
class Leaf : public Middle {
public:
// process() is final in Middle, cannot override
// void process() const override {} // ERROR!
void validate() const override
{
std::cout << " Leaf::validate" << std::endl;
}
};
int main()
{
// ------------------------------------------------------------------
// final methods in animal hierarchy
// ------------------------------------------------------------------
std::cout << "=== Final methods ===" << std::endl;
std::unique_ptr<Animal> dog(new Dog());
std::unique_ptr<Animal> golden(new GoldenRetriever());
std::cout << " Dog: " << dog->type() << " says " << dog->speak() << std::endl;
std::cout << " Golden: " << golden->type() << " says " << golden->speak() << std::endl;
std::cout << " (speak() is final in Dog -> Golden can't change it)" << std::endl;
std::cout << std::endl;
// ------------------------------------------------------------------
// final class (Singleton)
// ------------------------------------------------------------------
std::cout << "=== Final class ===" << std::endl;
Singleton& s = Singleton::instance(42);
std::cout << " Singleton value: " << s.value() << std::endl;
std::cout << " (class Singleton final -> cannot be subclassed)" << std::endl;
std::cout << std::endl;
// ------------------------------------------------------------------
// Hierarchy with selective final
// ------------------------------------------------------------------
std::cout << "=== Selective final in hierarchy ===" << std::endl;
Leaf leaf;
Base* ptr = &leaf;
ptr->process(); // Middle::process (final, not overridden in Leaf)
ptr->validate(); // Leaf::validate (overridden normally)
std::cout << std::endl;
// ------------------------------------------------------------------
// Summary
// ------------------------------------------------------------------
std::cout << "=== Summary ===" << std::endl;
std::cout << " 'final' on method: prevents subclass from overriding" << std::endl;
std::cout << " 'final' on class: prevents any subclass entirely" << std::endl;
std::cout << " Benefit: enforces design + enables devirtualization" << std::endl;
delete &Singleton::instance();
return 0;
}
/*
Expected output:
=== Final methods ===
Dog: Dog says Woof!
Golden: Golden Retriever says Woof!
(speak() is final in Dog -> Golden can't change it)
=== Final class ===
Singleton value: 42
(class Singleton final -> cannot be subclassed)
=== Selective final in hierarchy ===
Middle::process (final)
Leaf::validate
=== Summary ===
'final' on method: prevents subclass from overriding
'final' on class: prevents any subclass entirely
Benefit: enforces design + enables devirtualization
*/
Run command
g++ -std=c++11 -Wall -Wextra -o example final_specifier.cpp