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

วิธีป้องกันการสืบทอดคลาสใน C++


ที่นี่เราจะดูวิธีป้องกันการสืบทอดใน C ++ แนวความคิดในการป้องกันมรดกเรียกว่าขั้นสุดท้าย

ใน Java หรือ C# เราสามารถใช้คลาสสุดท้ายได้ ใน C ++ ไม่มีทางตรงเช่นนั้น ที่นี่เราจะมาดูวิธีการจำลองคลาสสุดท้ายใน C++

ที่นี่เราจะสร้างคลาสพิเศษหนึ่งคลาสที่เรียกว่า MakeFinalClass (คอนสตรัคเตอร์เริ่มต้นเป็นแบบส่วนตัว) ฟังก์ชันนี้ใช้เพื่อแก้ไขจุดประสงค์ของเรา Class MyClass หลักสามารถเรียก Constructor ของ MakeFinalClass ได้เนื่องจากเป็นคลาสของเพื่อน

สิ่งหนึ่งที่เราต้องสังเกตคือ MakeFinalClass ยังเป็นคลาสฐานเสมือนด้วย เราจะทำให้มันเป็นคลาสฐานเสมือนเพราะเราต้องการเรียกคอนสตรัคเตอร์ของ MakeFinalClass ผ่านตัวสร้างของ MyDerivedClass ไม่ใช่ MyClass (ตัวสร้างของคลาสฐานเสมือนไม่ได้ถูกเรียกโดยคลาสที่สืบทอดมาจากมัน แทนที่จะเป็นตัวสร้างที่ เรียกโดยคอนสตรัคเตอร์ของคลาสคอนกรีต)

ตัวอย่าง

#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;
}

ผลลัพธ์

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

เราสามารถสร้างออบเจ็กต์ของ MyClass ได้ เนื่องจากนี่คือเพื่อนของ MakeFinalClass และสามารถเข้าถึงตัวสร้างได้

ตัวอย่าง

#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;
}

ผลลัพธ์

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