C++ ไม่มีคีย์เวิร์ด final สำหรับคลาส (ก่อน C++11) แต่สามารถจำลองได้ด้วย idiom ใช้ virtual base class ที่มี private constructor
เทคนิค MakeFinal
class MakeFinal {
private:
MakeFinal() { cout << "MakeFinal ctor\n"; }
friend class FinalClass; // เฉพาะ FinalClass เข้าถึงได้
};
class FinalClass : virtual MakeFinal { // virtual inheritance สำคัญ
public:
FinalClass() { cout << "FinalClass ctor\n"; }
};
// พยายามสืบทอด - จะ Error
class Derived : public FinalClass {
public:
Derived() { cout << "Derived ctor\n"; }
};
int main() {
// Derived d; // Error: MakeFinal::MakeFinal() is private
FinalClass fc; // OK
}
หลักการ
MakeFinalมี private constructor เฉพาะFinalClassเป็น friend จึงเข้าถึงได้virtualinheritance ทำให้ Derived class ต้องเป็นคนเรียก constructor ของ MakeFinal โดยตรง (แต่เข้าถึงไม่ได้)- C++11+ ควรใช้
class FinalClass finalโดยตรง