공부/C++

Effective C++ 항목 9 : 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자

털빙이 2021. 5. 10. 18:42

//기본클래스 
class Transaction 
{
 
    public : Transaction(); 
    virtual void logTransaction() const = 0;
    ...
};

Transaction::Transaction()()
{
    ...
    logTransaction(); 
// 기본클래스의 생성자에서 가상함수를 호출하였다.. 문제됨 
} 

//파생클래스1 
class BuyTransaction: public Transaction
{ 
    public: virtual void logTransaction() const;
    ...
};


//main
 BuyTransaction b; 

기본 생성자 - 파생 생성자 - 파생 소멸자 - 기본 소멸자 순으로 호출 되므로

기본 생성자 호출하면서 logTransaction()을 호출함

문제는 파생 클래스는 생성된 상태가 아니므로 (생성자 안불림) logTransaction은 기본 클래스의 것을 호출하게됨.

만약 파생 클래스의 것을 호출하게 되면 생성 되지도 않은 객체의 데이터 멤버에 접근하려함..(미정의 동작)



해결방법

1. logTransaction을 비가상 함수로 만든다.
2. 파생 클래스의 생성자에서 기본 클래스 생성자를 호출하여 필요한 정보를 넘겨준다.