나는이 같은 클래스 Base
및 Derived
이했습니다이상한 행동은
class Base
{
public:
};
class Derived : public Base
{
public:
};
및 주요 기능 :
int main()
{
Base* ptr = new Derived;
std::cout << typeid(*ptr).name() << endl;
delete ptr;
system("pause");
}
프로그램 출력은 내가이 표시됩니다 예상 class Base
을 보여줍니다 class Derived
. 그러나 Base
클래스에 가상 메서드를 추가하면 출력 결과는 class Derived
입니다!
왜 RTTI에 최소한 하나의 가상 메소드가 필요한가요?
[Typeid not functionaling correcly] (http://stackoverflow.com/q/18147864/1708801)의 복제본처럼 보이지만 기본적으로 가상 메서드를 추가하면 원하는 결과를 얻을 수 있습니다. –
컴파일러를 작성했다면 어떻게'typeid'를 구현하겠습니까? 아마 숨겨진 가상 메서드로 그것을 할 것입니다. 그러나 클래스에 가상 메서드가 없으면 (따라서 vtable도 없음)이 방법은 불가능합니다. 나는 이것을 수용하기 위해 C++ 스펙이 작성되었다고 생각한다. –
'ptr'을'Base *'로 선언했습니다. 그 밖의 무엇을 기대합니까? 런타임 유형 검사가있는 Java와는 다릅니다. C++은 전적으로 정적입니다. – texasbruce