学习笔记(20):c++入门到精通教程 c++11/14/17-RTTI、dynamic_cast、typeid、虚函数表

立即学习:https://edu.csdn.net/course/play/9186/191704?utm_source=blogtoedu


    //一:RTTI是什么 (run time  type Identification):运行类型识别

    //Human* phuman = new Men;
    //Human& q = *phuman;  //*phuman 表示指针phuman所指向的对象
    RTTI 我们可以把这个称呼看成是一种系统提供给我们的一种能力 或者功能。
    (1)dynamic_case运算符: 能够将基类的指针或者 引用安全的转换为派生类的指针或者引用
    (2) typeid 运算符: 返回指针或者引用所指对象的实际类型
    补充: 基类中必须有一个虚函数 不然两个运算符结果不一样
    //phuman->eat();

    //二:  dynamtic_case运算符  如果该运算符能够转换成功 说明这个指针实际上是要转换到的那个类型

    //Human* phuman = new Men;
    //Men* p = (Men*)(phuman);
    //p->testfunc();

    //Human* phuman = new Men;
    //Men* pmen = dynamic_cast<Men*>(phuman);
    //if (pmen != nullptr)
    //{
    //    cout << "phuman是一个Men类型" << endl;
    //    pmen->testfunc();
    //}    
    //else
    //{
    //    cout << "phuman不是一个Men类型" << endl;
    //
    //}

    //对于引用,如果用dynamic_case转换失败

    //Human* phuman = new Men;
    //Human& q = *phuman;
    //try
    //{
    //    Men& menbm = dynamic_cast<Men&>(q);
    //    cout << "phuman实际上是一个Men类型" << endl;
    //    menbm.testfunc();  
    //
    //}
    //catch(std::bad_cast)
    //{
    //    cout << "phuman 实际上不是一个Men类型" << endl;
    //
    //}


    //typeid 运算符

    //Human* phuman = new Men;
    //Human& q = *phuman;
    //cout << typeid(*phuman).name() << endl;  //class Men
    //cout << typeid(q).name() << endl;       //class Men

    //char a[10] = { 5,1 };
    //int b = 10;
    //cout << typeid(a).name() << endl;
    //cout << typeid(b).name() << endl;
    //cout << typeid(19.6).name()<< endl;
    //cout << typeid("asd").name()<< endl;

//typeid 主要是为了比较两个指针是否指向同一类型的对象
//(1);两个指针定义的类型相同(Human)
//Human* phuman = new Men;
//Human* phuman2 = new Women;
//if(typeid(phuman) == typeid(phuman2))
//{
//    cout << "phuman和phuman2是同一种类型【看指针定义】" << endl;
//
//}

 

//(2)  
//Human* phuman = new Men;
//Men* phuman2 = new Men;
//Human *phuman3 = phuman2;
//if (typeid(*phuman) == typeid(*phuman2))
//{
//    cout << "phuman和phuman2指向的对象类型相同" << endl;
//
//}
//if (typeid(*phuman2) == typeid(*phuman3))
//{
//    cout << "phuman2和phuman3指向的对象类型相同" << endl;
//
//}

//Human* phuman = new Men;
//if (typeid(*phuman) == typeid(Men))
//{
//    cout << "phuman指向Men" << endl;
//    
//}
//if (typeid(*phuman) == typeid(Human))
//{
//    cout << "phuman指向Human" << endl;
//
//}

//基类必须有虚函数 否则上边的条件不成立

 

//四:type_info类
//
//Human* phuman = new Men;
//const type_info& tp = typeid(*phuman);
//cout << tp.name() << endl;
//
b) == ,!=
//Human* phuman2 = new Men;
//const type_info& tp2 = typeid(*phuman2);
//if (tp == tp2)
//{
//    cout << "tp和tp2类型相同" << endl;
//}
//Human* phuman3 = new Men;
//const type_info& tp3 = typeid(phuman3);
//if (tp == tp3)
//{
//    cout << "tp 和 tp3 类型相同" << endl;
//}

//五: RTTI与虚函数表

    //C++中如果类含有虚函数  编译器就会对该类产生一个虚函数表
    //虚函数表里有很多项 每一项都是一个指针 每个指针指向的是这个类里的各个虚函数的入口地址
    //虚函数表项里 第一个表项很特殊 , 它指向的不是虚函数的入口地址 它指向的实际上是咱们这个类所关联 的typeid

    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值