728x90
Protected 생성자에 접근하는 방법
직접 객체 생성 시 Protected 생성자에 접근할 수 없어 에러가 발생합니다.
하지만 Projected 생성자를 갖는 class를 상속한 Public 생성자를 갖는 class에서는 접근이 가능하게 됩니다.
#include <iostream>
using namespace std;
class Car
{
protected:
Car() {
cout << "this is a car" << endl;
}
};
class Bus : public Car
{
public:
Bus() {
cout << "this is a bus" << endl;
}
};
int main()
{
// Car car; // 접근 실패
Bus bus; // 접근 가능
}
위의 소스에서 bus 생성 시 Bus 클래스가 호출되게 되고 Bus는 자신의 생성자를 호출하기 전에 상속받는 Car의 생성자를 먼저 호출하게 됩니다.
따라서 실행 결과는 아래와 같습니다.
this is a car
this ia a bus
Protected 소멸자에 접근하는 방법
객체를 stack에 못 만들게 하고 heap에 만들게 할 때 사용하는 스킬입니다.
stack에 만든다면 선언된 block을 벗어날 때 소멸자를 호출해야 하는데 protected 소멸자를 호출하지 못하여 에러가 발생합니다.
참조계수 기반의 객체의 라이프사이클 관리에 주로 사용됩니다.
#include <iostream>
using namespace std;
class Car
{
public:
Car() {
cout << "this is a car" << endl;
}
void destroy() {
delete this;
}
protected:
~Car()
{
cout << "destroy a car" << endl;
}
};
int main()
{
// Car car; // 소멸자에 접근할 수 없으므로 stack에 객체를 만들 수 없음
Car* car = new Car; // heap에는 만들 수 있음
// delete p; // 만들었지만 소멸자에 접근할 수 없음
car->destroy(); // 우회하여 소멸자를 호출함
}
'Pattern > C++' 카테고리의 다른 글
[C++] 템플릿 메소드 패턴 (Template method pattern) (0) | 2021.03.21 |
---|---|
[C++] 프로토타입 패턴 (Prototype pattern) (0) | 2021.03.21 |
[C++] interface와 결합(Coupling) (0) | 2021.03.20 |
[C++] 추상 클래스 (abstract class) (0) | 2021.03.20 |
[C++] Upcasting, Downcasting, Virtual, Override (0) | 2021.03.20 |