Xem cách ngăn chặn kế thừa trong C++. Khái niệm ngăn chặn kế thừa gọi là lớp final (final class).
Trong Java hay C# có từ khóa final class. Trong C++ không có cách trực tiếp. Sẽ mô phỏng lớp final trong C++.
Tạo một lớp phụ MakeFinalClass (hàm tạo mặc định là private). Lớp chính MyClass có thể gọi hàm tạo của MakeFinalClass vì chúng là friend class.
Lưu ý MakeFinalClass cũng là lớp cơ sở ảo (virtual base class). Làm ảo vì muốn gọi hàm tạo của MakeFinalClass qua hàm tạo của MyDerivedClass, không phải MyClass (hàm tạo của lớp cơ sở ảo không được gọi bởi lớp kế thừa từ nó, mà được gọi bởi hàm tạo của lớp cụ thể).
Ví dụ
#include <iostream> using namespace std; class MyClass; class MakeFinalClass { private: MakeFinalClass() { cout << "This is constructor of the MakeFinalClass" << endl; } friend class MyClass; }; class MyClass : virtual MakeFinalClass { //lớp này sẽ là final class public: MyClass() { cout << "This is constructor of the final Class" << endl; } }; //thử tạo lớp dẫn xuất class MyDerivedClass : MyClass { public: MyDerivedClass() { cout << "Constructor of the Derived Class" << endl; } }; main() { MyDerivedClass derived; }Kết quả
In constructor 'MyDerivedClass::MyDerivedClass()': [Error] 'MakeFinalClass::MakeFinalClass()' is private
Có thể tạo đối tượng MyClass vì nó là friend của MakeFinalClass, có quyền truy cập hàm tạo.
Ví dụ
#include <iostream> using namespace std; class MyClass; class MakeFinalClass { private: MakeFinalClass() { cout << "This is constructor of the MakeFinalClass" << endl; } friend class MyClass; }; class MyClass : virtual MakeFinalClass { //lớp này sẽ là final class public: MyClass() { cout << "This is constructor of the final Class" << endl; } }; main() { MyClass obj; }Kết quả
This is constructor of the MakeFinalClass This is constructor of the final Class