2013-10-15 2 views
0

필자가 알고 있듯이 순수 가상 메서드가 자식 클래스에서 구현되지 않을 수도 있지만 자식 클래스를 호출하지 않으면 빌드 오류가 발생할 수 있습니다.C++에서 구현되지 않은 Pure Virtuals 잡기

나는 이것을 시뮬레이션 할 수 없었다. 어떤 일이 일어날 수있는 방법에 대한 통찰력이 있습니까? 나는 많은 수색을했으나 아무것도 준비 할 수 없었습니다.

답변

6

가상 함수가 기본 클래스의 생성자에서 호출 될 때 발생합니다.

#include <iostream> 

class Base 
{ 
public: 
    Base() { g();} 
    virtual ~Base() {} 

    void g() { f(); } 
    virtual void f() = 0; 
}; 

class Derived : public Base 
{ 
public: 
    Derived() : Base() {} 
    ~Derived() {} 

    void f() { std::cout << "Derived f()" << std::endl; } 
}; 

int main() 
{ 
    Derived d; // here we have the call to the pure virtual function 

    return 0; 
} 

EDIT :

주요 문제는 다음과 Derived 객체가 생성되면, 오브젝트가 그 Base::Base 생성자 실행되는 Base로 시작한다. 개체가 여전히 Base이므로 f() (g() 통해) 호출은 Base::f이 아니고 Derived::f이 아닙니다. Base::Base 생성자가 완료되면 개체는 Derived이되고 Derived::Derived 생성자가 실행됩니다.

+0

가상 함수를 생성자 내부에서 호출하는 것이 좋지 않습니까? – Pradheep

+0

@Pradheep 물론, 아니야. 그러나 위의 예는 잘못된 일을하는 예입니다. –

+0

@Pradheep - 생성자 (또는 소멸자) 내에 가상 함수를 호출 할 때 아무 문제가 없습니다. 나쁜 생각이라는 "규칙"은 그러한 호출이 어떻게 작동 하는지를 이해하지 못하는 사람들로부터옵니다. 생성자 (또는 소멸자)가 현재 실행중인 유형에 대해 정의 된 버전을 호출합니다. 반드시 가장 파생 된 유형은 아닙니다. –

관련 문제