관리 메뉴

기억을 위한 기록들

[CPP-effective] 2-4 객체 생성/소멸 과정 중에는 가상함수를 호출하지말자. 본문

C & CPP/Effective C++

[CPP-effective] 2-4 객체 생성/소멸 과정 중에는 가상함수를 호출하지말자.

에드윈H 2021. 3. 22. 17:05

이유는 2가지로

 

첫 번째는 호출 결과가 원하는 대로 돌아가지 않고,

두 번째로는 원하는 대로 돌아간다고 해도 뭔가 굉장히 이상할 것이다.

 

 

 

예를 들어

class Player {
public:
	Player()
	{
		log(); 
	}
	virtual void log()
	{
		cout << "Player Log" << endl;
	}
};

class AnotherPlayer : public Player
{
public:
	//..
	virtual void log()
	{
		cout << "Another Player Log" << endl;
	}//호출
};

 

여기서 AnotherPlayer 생성자를 호출할 때, Player의 생성자도 호출이 된다.

그러면서 자동으로 log 함수도  호출이 되는데, 문제가 바로 AnotherPlayer의 log 함수가 아니라 Player의 log함수가 호출되는 것이다. 

 

 

 

* 정리

생성자 or소멸자 안에서 가상 함수를 호출하지 말자.

가상 함수라고 해도, 지금 실행 중인 생성자나 소멸자에 해당되는 클래스의 자식 클래스 쪽으로는 내려가지 않는다.