Napoliano 2025. 1. 16. 21:08
728x90

 

 

 

https://www.ecourse.co.kr/courses/cpp_designpattern/lessons/constructor/

 

C++ Design Pattern → constructor - ecourse

 

www.ecourse.co.kr

 

 

파생 클래스 생성자에서 기반 클래스 생성자를 호출하는 코드를 작성하지 않으면, 컴파일러가 기반 클래스의 '디폴트 생성자'를 호출하는 코드를 추가해 준다.

 

class Base
{
public:
	Base() { std::cout << "Base()" << std::endl;  }
	Base(int a) { std::cout << "Base(int)" << std::endl; }
	~Base() { std::cout << "~Base()" << std::endl; }
};

class Derived : Base
{
public:
	Derived() { std::cout << "Derived()" << std::endl; }
	Derived(int a) { std::cout << "Derived(int)" << std::endl; }
	~Derived() { std::cout << "~Derived()" << std::endl; }
};

int main()
{
	Derived d(0);
    
	return 0;
}

 

따라서 위 코드에서 Derived 클래스의 생성자들은

 

class Derived : Base
{
public:
	Derived() : Base() { std::cout << "Derived()" << std::endl; }
	Derived(int a) : Base() { std::cout << "Derived(int)" << std::endl; }

	...
};

 

결국 위 코드와 동일하고,

 

Base()
Derived(int)
~Derived()
~Base()

 

코드를 실행해 보면 Base 클래스의 디폴트 생성자가 호출되는 것을 확인할 수 있다. 위 결과를 보면 Base()가 먼저 실행되는 것처럼 보이지만, 실제로는 Derived(int)가 먼저 호출되고, Derived(int)의 body가 실행되기 전에 Base()가 실행되는 것이다.

 

위와 같은 이유로 기반 클래스에 디폴트 생성자가 없는 경우에는 파생 클래스에서 반드시 기반 클래스 생성자를 명시적으로 호출해 줘야 한다.

 

 


 

 

class Animal
{
protected:
	Animal() { }
};

class Dog : public Animal
{
public:
	Dog() {}
};

int main()
{
	Animal a; //error
	Dog d;

	return 0;
}

 

한편 protected 생성자는 자기 자신의 객체는 생성할 수 없도록 하고, 파생 클래스의 객체는 생성할 수 있도록 하기 위해서 사용된다. 따라서 위 예제에서 추상적 존재인 Animal 객체는 생성할 수 없지만 Dog 객체는 생성 가능하다. 

 

 

 

728x90