Computer >> Máy Tính >  >> Lập trình >> C ++

Cách ngăn kế thừa lớp trong C ++

Ở đây chúng ta sẽ xem làm thế nào để ngăn chặn kế thừa trong C ++. Khái niệm ngăn chặn sự kế thừa được gọi là lớp cuối cùng.

Trong Java hoặc C #, chúng ta có thể sử dụng các lớp cuối cùng. Trong C ++ không có cách nào trực tiếp như vậy. Ở đây chúng ta sẽ xem cách mô phỏng lớp cuối cùng trong C ++.

Ở đây chúng ta sẽ tạo thêm một lớp gọi là MakeFinalClass (hàm tạo mặc định của nó là private). Chức năng này được sử dụng để giải quyết mục đích của chúng tôi. Lớp MyClass chính có thể gọi hàm tạo của MakeFinalClass vì chúng là các lớp bạn bè.

Một điều chúng ta cần lưu ý, MakeFinalClass cũng là một lớp cơ sở ảo. Chúng tôi sẽ đặt nó là lớp cơ sở ảo vì chúng tôi muốn gọi phương thức khởi tạo của MakeFinalClass thông qua phương thức khởi tạo của MyDerivedClass, không phải MyClass (Phương thức khởi tạo của một lớp cơ sở ảo không được gọi bởi lớp kế thừa từ nó, thay vì phương thức khởi tạo được được gọi bởi hàm tạo của lớp bê tông).

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 { //this will be final class
   public:
      MyClass() {
         cout << "This is constructor of the final Class" << endl;
      }
};
//try to make derived class
class MyDerivedClass : MyClass {
   public:
      MyDerivedClass() {
         cout << "Constructor of the Derived Class" << endl;
      }
};
main() {
   MyDerivedClass derived;
}

Đầu ra

In constructor 'MyDerivedClass::MyDerivedClass()':
[Error] 'MakeFinalClass::MakeFinalClass()' is private

Chúng ta có thể tạo các đối tượng của MyClass vì đây là bạn của MakeFinalClass và có quyền truy cập vào các hàm tạo của nó.

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 { //this will be final class
   public:
      MyClass() {
         cout << "This is constructor of the final Class" << endl;
      }
};
main() {
   MyClass obj;
}

Đầu ra

This is constructor of the MakeFinalClass
This is constructor of the final Class