본문 바로가기
디자인 패턴/[ecourse] C++ Design Pattern

1. protected 생성자 & 소멸자

by 헛둘이 2023. 2. 8.

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; 를 실행한다.

 

자주 쓰이지는 않지만

참조계수기반 객체 수명관리 기법에서 주로 사용된다.

'디자인 패턴 > [ecourse] C++ Design Pattern' 카테고리의 다른 글

4. State Pattern  (0) 2023.02.10
3. Template Method & Strategy Pattern  (0) 2023.02.09
2. 인터페이스와 커플링  (0) 2023.02.08

댓글