2013-09-02 2 views
0
class Base 
    { 
    public: 
     Base(){Foo();} 
     ~Base(){Foo();} 
     virtual void Foo(){std::cout<<"base";} 
    }; 

    class Derived: public Base 
    { 
    public: 
     Derived(){Foo();} 
     ~Derived(){Foo();} 
     void Foo(){std::cout<<"derived";} 
    }; 

     //main 
    { 
     Derived d; 
    } 

이 코드가 "기본"및 "파생 된"코드를 인쇄하는 이유는 무엇입니까?
나는 가상 함수 호출을 생성자 또는 desctructor 내부에 두지 않는 것이 좋다고 생각한다. 위의 코드가 동작하는 이유를 알고 싶다. 감사생성자 및 소멸자에서 가상 함수 호출

+2

사실, "basederivedderivedbase"('// main'을 수정 한 후)를 출력하고, 잠시 생각하면 이유를 알 수 있습니다. – WhozCraig

답변

4

클래스 C의 생성자를 실행하는 동안 파생 된 하위 개체는 아직 구성되지 않았습니다. 따라서, 건설중인 객체의 동적 유형은 생성자의 정적 유형, 즉 C입니다. 어떤 virtual 함수는 객체가 C 인 것처럼 전달됩니다. 마찬가지로 파생 된 유형의 객체가 파괴되고 소멸자가 C 인 경우 파생 된 모든 하위 객체가 이미 파괴되었으며 형식은 마치 C 인 것처럼 작동합니다.

즉, 생성 및 삭제 중에 상속을 포함하는 개체 유형이 변경됩니다! 동적 디스패치는 객체의 현재 유형과 일치하도록 정렬됩니다.