생성자 안에서 가상함수 호출

jelly·2025년 3월 28일

생성자 내부에서 virtual function을 호출하면 정적 바인딩(static binding)이 발생하여, 기대한 동적 바인딩(dynamic binding)이 이루어지지 않는 문제가 발생합니다.

🔹 문제의 원인
C++에서 객체의 생성 과정은 다음과 같습니다:

기본 클래스(Base Class)의 생성자가 실행

파생 클래스(Derived Class)의 생성자가 실행

객체가 완전히 생성되기 전까지는 파생 클래스의 멤버가 초기화되지 않은 상태입니다. 따라서, 생성자 내부에서 virtual function을 호출하면,

현재 생성 중인 클래스의 함수가 호출됨

파생 클래스의 오버라이딩된 함수는 호출되지 않음

이는 객체가 아직 완전히 초기화되지 않았기 때문입니다.

#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base Constructor\n";
        foo();  // virtual function 호출
    }
    
    virtual void foo() { std::cout << "Base::foo()\n"; }
};

class Derived : public Base {
public:
    Derived() {
        std::cout << "Derived Constructor\n";
    }
    
    void foo() override { std::cout << "Derived::foo()\n"; }
};

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

0개의 댓글