디자인 패턴/[ecourse] C++ Design Pattern
1. protected 생성자 & 소멸자
헛둘이
2023. 2. 8. 10:06
protected에 생성자가 있는 경우
생성자가 protected에 있는 경우, 외부에서 생성할 수 없다.
파생 클래스의 생성자에서만 불릴 수 있다.
class Animal
{
public:
virtual ~Animal() {}
protected:
Animal() {}
};
class Dog : public Animal
{
public:
Dog() {}
};
*기반 클래스의 생성자와 파생 클래스의 생성자 중 어떤 게 먼저 불릴까?
- 보통 기반 클래스의 생성자가 먼저 불린다고 알고 있지만 (결과적으로는 맞음)
- 파생 클래스가 먼저 불리고 거기서 기반 클래스를 먼저 실행시키는 것
- 단지 그 시점이 파생 클래스 생성자 내부의 코드를 실행하기 전이라서 먼저 기반 클래스의 코드가 먼저 실행되는 것 뿐임
Dog() : Animal() {}
- 따라서 현실세계에서 존재할 수 없는 클래스를 만들 때 protected에 생성자를 둬야 한다!
- 개념 자체는 순수가상함수와 비슷하구만
protected에 소멸자가 있는 경우
protected에 있으면 외부에서 소멸자를 호출할 수 없다.
그래서 스택에 객체를 생성하려고 하면 에러가 발생한다.
그런데 스택에는 만들수 없으나 힙에는 만들 수 있다.
Car* p = new Car;
그런데 delete할 때 다시 에러가 발생하는데,
이걸 해결하기 위해 멤버 함수로 Destroy 함수를 만들고 그 안에서 delete this; 를 실행한다.
자주 쓰이지는 않지만
참조계수기반 객체 수명관리 기법에서 주로 사용된다.