0
필자가 알고 있듯이 순수 가상 메서드가 자식 클래스에서 구현되지 않을 수도 있지만 자식 클래스를 호출하지 않으면 빌드 오류가 발생할 수 있습니다.C++에서 구현되지 않은 Pure Virtuals 잡기
나는 이것을 시뮬레이션 할 수 없었다. 어떤 일이 일어날 수있는 방법에 대한 통찰력이 있습니까? 나는 많은 수색을했으나 아무것도 준비 할 수 없었습니다.
필자가 알고 있듯이 순수 가상 메서드가 자식 클래스에서 구현되지 않을 수도 있지만 자식 클래스를 호출하지 않으면 빌드 오류가 발생할 수 있습니다.C++에서 구현되지 않은 Pure Virtuals 잡기
나는 이것을 시뮬레이션 할 수 없었다. 어떤 일이 일어날 수있는 방법에 대한 통찰력이 있습니까? 나는 많은 수색을했으나 아무것도 준비 할 수 없었습니다.
가상 함수가 기본 클래스의 생성자에서 호출 될 때 발생합니다.
#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
생성자가 실행됩니다.
가상 함수를 생성자 내부에서 호출하는 것이 좋지 않습니까? – Pradheep
@Pradheep 물론, 아니야. 그러나 위의 예는 잘못된 일을하는 예입니다. –
@Pradheep - 생성자 (또는 소멸자) 내에 가상 함수를 호출 할 때 아무 문제가 없습니다. 나쁜 생각이라는 "규칙"은 그러한 호출이 어떻게 작동 하는지를 이해하지 못하는 사람들로부터옵니다. 생성자 (또는 소멸자)가 현재 실행중인 유형에 대해 정의 된 버전을 호출합니다. 반드시 가장 파생 된 유형은 아닙니다. –