여기서는 C++에서 상속을 방지하는 방법을 살펴보겠습니다. 상속을 방지하는 개념을 최종 클래스라고 합니다.
Java 또는 C#에서는 final 클래스를 사용할 수 있습니다. C++에는 그러한 직접적인 방법이 없습니다. 여기서 우리는 C++에서 최종 클래스를 시뮬레이션하는 방법을 볼 것입니다.
여기에서 MakeFinalClass(기본 생성자는 private임)라는 추가 클래스를 하나 생성합니다. 이 함수는 우리의 목적을 해결하는 데 사용됩니다. 기본 클래스 MyClass는 친구 클래스이므로 MakeFinalClass의 생성자를 호출할 수 있습니다.
한 가지 주의해야 할 점은 MakeFinalClass도 가상 기본 클래스라는 것입니다. MyClass가 아닌 MyDerivedClass의 생성자를 통해 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;
}
};
//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
이것은 MakeFinalClass의 친구이고 생성자에 액세스할 수 있으므로 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;
}
};
main() {
MyClass obj;
} 출력
This is constructor of the MakeFinalClass This is constructor of the final Class