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

Do not use virtual function in constructor/destructor

Posted by dydtjr1128 on July 23, 2019 · 186 words/1 min read EffectiveC++

Do not use virtual function in constructor/destructor.

class Transaction {
public:
   virtual void logTransaction() const = 0;
};
Transaction::Transaction() {
   logTransaction();
}

class BuyTransaction : public Transaction {
public:
   virtual void logTransaction() const;
};

class SellTransaction : public Transaction {
public:
   virtual void logTransaction() const;
};

int main() {
   BuyTransaction b;//error!
}

생성자의 성성 순서는 Transaction의 생성자가 불리고 BuyTransaction이 불리게 되는데 Transaction의 생성자 가 끝나기 전에 함수를 호출한다. 그러나 생성자가 끝나기 전에는 절대로 파생 클래스로 내려가지 않는다. 즉, 가상 함수가 먹히지 않는다.

즉, Transaction의 생성자가 끝나기 전까지, BuyTransaction의 생성자가 시작하기 전까지의 타입은 Transaction인 것이다.

요약하자면 Transaction 생성자에서 Transaction의 순수 가상 함수를 호출하였기 때문에 에러가 발생한 것이다.