Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การจำลอง Final Class ใน C++

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 จึงเข้าถึงได้
  • virtual inheritance ทำให้ Derived class ต้องเป็นคนเรียก constructor ของ MakeFinal โดยตรง (แต่เข้าถึงไม่ได้)
  • C++11+ ควรใช้ class FinalClass final โดยตรง