객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자


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



 기본클래스가 생성되는 시점에, 파생클래스는 아직 만들어지지 않은 상태다
이때 가상함수를 실행하게 되면 파생클래스의 함수는 실행할 없는게 당연




 소멸자의 경우도 마찬가지

파생클래스가 소멸된 시점에 기본클래스의 소멸자 내부에 가상함수에 있다면 프로그래머가 원하는 동작을 하지 않을 있다.



class Transaction {
public:
    Transaction() 
    { 
        logTransaction(); 
    }
    virtual void logTransaction() const { std::cout << "Transaction" << std::endl; }
};
class BuyTransaction : public Transaction {
public:
    virtual void logTransaction() const { std::cout << "BuyTransaction" << std::endl; }
};
int main() {
    BuyTransaction tr;        //BuyTransaction 가 아닌 Transaction 출력
}
cs

 + 생성자 안에서 비가상함수를 호출한다 하더라도 해당 비가상함수 안에서 가상함수를 호출한다면 똑같은 문제가 발생한다. 특별히 주의할 부분


 파생클래스 객체의 기본 클래스 부분이 생성 및 소멸되는 동안은  객체의 타입은 전부 기본 클래스로 결정되므로가상함수를 포함해서 dynamic_cast / typeid  사용할  영향을 끼친다.

댓글

이 블로그의 인기 게시물

Unity - Dialogue 시스템을 구현할 때 유용한 무료 에셋

Unity - 메타 파일

Unity - 라이브러리 폴더