C++ typeid() 基类必须是多态类

 基类如果没有虚函数。输出结果(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++ 为什么要这样规定?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值