ZC:C++ 编程思想——运行时类型识别 - 浅墨浓香 - 博客园.html(https://www.cnblogs.com/5iedu/articles/5585895.html

------------------------------两种Bad-cast-----------------------------------
1. dynamic_cast转换一个完全不相关的类
2. typeid操作一个空指针

1、环境:Win7x64、Qt5.3.2 MSVC2010 OpenGL、vs2010

2、代码:

    class Tbase
{
public:
int Fi; public:
virtual void Say(){ qDebug() << "Tbase"; }
}; class Tother
{
public:
int Fi; public:
virtual void Say(){ qDebug() << "Tother"; }
}; class TA1 :public Tbase
{
public:
int FiA; public:
virtual void Say(){ qDebug() << "TA1"; }
}; class TB1 :public TA1
{
public:
int FiB; public:
virtual void Say(){ qDebug() << "TB1"; }
}; class TC1 :public TB1
{
public:
int FiC; public:
virtual void Say(){ qDebug() << "TC1"; }
}; class TA2 :public Tbase
{
public:
int FiA; public:
virtual void Say(){ qDebug() << "TA2"; }
}; class TB2 :public TA2
{
public:
int FiB; public:
virtual void Say(){ qDebug() << "TB2"; }
}; class TC2 :public TB2
{
public:
int FiC; public:
virtual void Say(){ qDebug() << "TC2"; }
}; void MainWindow::on_pushButton_clicked()
{
Tbase *pC1 = new TC1(); if ( typeid(*pC1) == typeid(TC1) ) { qDebug() << "pC1 is TC1"; } else { qDebug() << "pC1 is not TC1"; }  // ZC: is
if ( typeid(*pC1) == typeid(TB1) ) { qDebug() << "pC1 is TB1"; } else { qDebug() << "pC1 is not TB1"; }  // ZC: is not
if ( typeid(*pC1) == typeid(TA1) ) { qDebug() << "pC1 is TA1"; } else { qDebug() << "pC1 is not TA1"; }  // ZC: is not
if ( typeid(*pC1) == typeid(Tbase) ) { qDebug() << "pC1 is Tbase"; } else { qDebug() << "pC1 is not Tbase"; }  // ZC: is not
qDebug() << ""; if ( typeid(*pC1) == typeid(TC2) ) { qDebug() << "pC1 is TC2"; } else { qDebug() << "pC1 is not TC2"; }  // ZC: is not
if ( typeid(*pC1) == typeid(TB2) ) { qDebug() << "pC1 is TB2"; } else { qDebug() << "pC1 is not TB2"; }  // ZC: is not
if ( typeid(*pC1) == typeid(TA2) ) { qDebug() << "pC1 is TA2"; } else { qDebug() << "pC1 is not TA2"; }  // ZC: is not
qDebug() << ""; // *** Tbase *pB1 = new TB1(); if ( typeid(*pB1) == typeid(TC1) ) { qDebug() << "pB1 is TC1"; } else { qDebug() << "pB1 is not TC1"; }  // ZC: is not
if ( typeid(*pB1) == typeid(TB1) ) { qDebug() << "pB1 is TB1"; } else { qDebug() << "pB1 is not TB1"; }  // ZC: is
if ( typeid(*pB1) == typeid(TA1) ) { qDebug() << "pB1 is TA1"; } else { qDebug() << "pB1 is not TA1"; }  // ZC: is not
if ( typeid(*pB1) == typeid(Tbase) ) { qDebug() << "pB1 is Tbase"; } else { qDebug() << "pB1 is not Tbase"; }  // ZC: is not
qDebug() << ""; if ( typeid(*pB1) == typeid(TC2) ) { qDebug() << "pB1 is TC2"; } else { qDebug() << "pB1 is not TC2"; }  // ZC: is not
if ( typeid(*pB1) == typeid(TB2) ) { qDebug() << "pB1 is TB2"; } else { qDebug() << "pB1 is not TB2"; }  // ZC: is not
if ( typeid(*pB1) == typeid(TA2) ) { qDebug() << "pB1 is TA2"; } else { qDebug() << "pB1 is not TA2"; }  // ZC: is not
qDebug() << ""; qDebug() << "*** *** *** *** *** *** *** *** *** *** ***"; } void MainWindow::on_pushButton_2_clicked()
{
Tbase *pBase = new TC1();
TC1* pC1 = dynamic_cast<TC1*>(pBase);
TB1* pB1 = dynamic_cast<TB1*>(pBase);
TA1* pA1 = dynamic_cast<TA1*>(pBase);
qDebug() << "pC1" << (int)pC1;  // ZC: != 0
qDebug() << "pB1" << (int)pB1;  // ZC: != 0
qDebug() << "pA1" << (int)pA1;  // ZC: != 0 TC2* pC2 = dynamic_cast<TC2*>(pBase);
TB2* pB2 = dynamic_cast<TB2*>(pBase);
TA2* pA2 = dynamic_cast<TA2*>(pBase);
qDebug() << "pC2" << (int)pC2;  // ZC: == 0
qDebug() << "pB2" << (int)pB2;  // ZC: == 0
qDebug() << "pA2" << (int)pA2;  // ZC: == 0 qDebug() << ""; pBase = new TB1();
pC1 = dynamic_cast<TC1*>(pBase);
pB1 = dynamic_cast<TB1*>(pBase);
pA1 = dynamic_cast<TA1*>(pBase);
qDebug() << "pC1" << (int)pC1;  // ZC: == 0
qDebug() << "pB1" << (int)pB1;  // ZC: != 0
qDebug() << "pA1" << (int)pA1;  // ZC: != 0 pC2 = dynamic_cast<TC2*>(pBase);
pB2 = dynamic_cast<TB2*>(pBase);
pA2 = dynamic_cast<TA2*>(pBase);
qDebug() << "pC2" << (int)pC2;  // ZC: == 0
qDebug() << "pB2" << (int)pB2;  // ZC: == 0
qDebug() << "pA2" << (int)pA2;  // ZC: == 0 qDebug() << ""; pBase = new Tbase();
Tother* pOther = dynamic_cast<Tother*>(pBase);
qDebug() << "pOther" << (int)pOther;  // ZC: == 0 }

3、控制台输出:

  3.1、Debug:

  3.2、Release:

pC1 is TC1
pC1 is not TB1
pC1 is not TA1
pC1 is not Tbase pC1 is not TC2
pC1 is not TB2
pC1 is not TA2 pB1 is not TC1
pB1 is TB1
pB1 is not TA1
pB1 is not Tbase pB1 is not TC2
pB1 is not TB2
pB1 is not TA2 *** *** *** *** *** *** *** *** *** *** ***
pC1 4912920
pB1 4912920
pA1 4912920
pC2 0
pB2 0
pA2 0 pC1 0
pB1 4919680
pA1 4919680
pC2 0
pB2 0
pA2 0 pOther 0

4、想在 构造函数中 判断 自己是哪个类,为 TA1添加构造函数:

  

  编译的时候,直接就报错了...

5、

C++.运行时类型判断_测试代码的更多相关文章

  1. C++运行时类型判断dynamic_cast和typeid

    dynamic_cast dynamic_cast < Type-id > ( expression ) dynamic_cast<类型>(变量) 在运行期间检测类型转换是否安 ...

  2. RTTI (Run-Time Type Identification,通过运行时类型识别) 转

    参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   RTTI提供了以下两个 ...

  3. 8. 多态——编译时类型&运行时类型

    一.引用变量的两种类型 1. 编译时类型:由声明该变量时使用的类型决定 2. 运行时类型:由实际赋给该变量的对象决定 如果编译时类型和运行时类型不一致,就可能出现多态. class BaseClass ...

  4. 【JavaSE】运行时类型信息(RTTI、反射)

    运行时类型信息使得你可以在程序运行时发现和使用类型信息.--<Think in java 4th> **** 通常我们在面向对象的程序设计中我们经常使用多态特性使得大部分代码尽可能地少了解 ...

  5. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

  6. c++运行时类型识别(rtti)

    一个简单运行时类型识别 namespace rtti_ex { /* * 类型信息基类 */ class i_type_info { public: // 判断是否是指定类型 bool is(cons ...

  7. MFC原理第三讲.RTTI运行时类型识别

    MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...

  8. java多态的向上转型与向下转型(与编译时类型与运行时类型有关)

    1.编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定. 当编译时类型和运行时类型不一致时,就会出现所谓的多态. 因为子类是一个特殊的父类,因此java允许把一个子类对象直接 ...

  9. 《深入浅出MFC》系列之运行时类型识别(RTTI)

    /********************************************************************************** 发布日期:2017-11-13  ...

随机推荐

  1. session(概念、session对象的获取、删除、验证)

    # 1.session(会话)是什么? 服务器为了保存用户状态而创建的一个特殊的对象. 注: 当浏览器访问服务器时,服务器会创建一个session对象(该对象有一个唯一的id,一般称之为session ...

  2. EDK II之DXE Core框架简介

    本文旨在简单的介绍一下DXE阶段的工作原理: UDK2015的开源代码下载:https://github.com/tianocore/tianocore.github.io/wiki/EDK-II D ...

  3. RHEL6/7 x86_64下cachefilesd占用cpu达到100%

    昨天,有个测试环境cachedfilesd CPU 100%,一直在跑了挺久,经查 1. CacheFiles介绍NFS是一种经常使用到的网络共享文件系统,在分布式环境下,多台服务器的文件共享是一个问 ...

  4. uml类图和er图中主外键的表示区别

    在er图也就是数据库中,无论是mysql/oracle都是从表引用主表的pk作为外键. 而在uml类图表示法中,他们的顺序则刚好相反,从主对象导向到子对象,如下: 主体是资金借款方,征信信息和资金借款 ...

  5. 【题解】Luogu P2146 [NOI2015]软件包管理器

    题面:https://www.luogu.org/problemnew/lists?name=2146 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 这道题就是树链剖分的模板,详细解释见程序. ...

  6. qtquickcontrols2控件集(使用参考重构)

           随着Qt的版本升级,其自带的controls控件库也不断升级,目前已经到了2.3的版本.本文通过重构并且解读Qt自带的gallery例程,说明新版本controls控件库的相关特性 来自 ...

  7. NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset

    描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...

  8. 尚硅谷面试第一季-15Mysql什么时候建索引

    课堂重点: MySQL的官方定义: 索引的优势: 索引的劣势: 那些情况下需要建立索引: 那些情况下不要建立索引: 何为过滤性:例如在数据库字段里,手机号/身份证号这些字段是过滤性好的字段,而性别则是 ...

  9. 3545: [ONTAK2010]Peaks 平衡树,最小生成树

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3545 离线询问,按照权值排个序 就是在克鲁斯卡尔时候维护个treap,到时候挨个查询一下就好 ...

  10. 放棋子|2012年蓝桥杯B组题解析第七题-fishers

    (13')放棋子 今有 6 x 6 的棋盘格.其中某些格子已经预先放好了棋子.现在要再放上去一些,使得:每行每列都正好有3颗棋子.我们希望推算出所有可能的放法.下面的代码就实现了这个功能. 初始数组中 ...