基类如果没有虚函数。输出结果(rtti)就不对。不知道为什么。环境:win2000、vs2003、控制台工程。/GR
class BaseClass{
// 如果把这行注释掉。下面的输出结果就不正确了。(应该是DerivedClass1,却变成了BaseClass)为什么。(gcc也是这种情况)
virtual void vfunc(){};
};
class DerivedClass1 : public BaseClass{};
class DerivedClass2 : public BaseClass{};
int _tmain(int argc, _TCHAR* argv[]){
DerivedClass1 obj1;
BaseClass*p = &obj1;
std::cout << typeid(*p).name() << std::endl;
}
其实,这根本不是错误。ISO C++98 规定,涉及继承的 RTTI 都要求对象是“多态类型”:
5.2.7 Dynamic cast
条款6 在其他情况下, v 必须是多态类型(10.3)的指针或者左值。5.2.8 Type identification
条款2 当type_info作用于多态类型(10.3)左值的时候,结果是描述最后继承对象的 type_info 对象(即,动态对象)。
那么多态类型是什么呢?
10.3 Virtual functions
条款1 ... 一个包含或者继承虚函数的class 被称为多态 class
看来虚函数和RTTI的确存在深刻的联系。但是,C++ 为什么要这样规定?