dynamic_cast 转换示例

/*
带虚函数与不带虚函数转换的区别 dynamic_cast:必须要有虚函数才可以转换
dynamic_cast:只能处理转换指针或引用,不能转换对象
dynamic_case 只能识别多态数据类型,转换失败就是null
多态,父类指针可以根据多态转化为子类指针
子类指针存储一个父类指针,转换失败。指针为 00000
子类指针转换成父类,自动转换 typeid:自动识别类型,依赖于虚函数 //虚函数重载和返回值无关 和参数的类型 个数 顺序有关
//虚函数被继承下来了还是虚函数
//如果要使用被继承的虚函数 不允许出现虚函数重载和覆盖
//多态可以跨类 爷爷辈的指针 可以存储孙子辈的地址 父辈拔针的地址
*/ #include <iostream> /*
没有虚函数的情况下,子类同名函数会覆盖父类,
父类指针存储子类地址:
1、有虚函数情况:调用子类方法
2、没有虚函数情况:调用父类方法
*/
class base1
{
public:
virtual void show()
{
std::cout << "base1->show()" << std::endl;
}
}; class baseX: public base1
{
public:
void show()
{
std::cout << "baseX->show()" << std::endl;
}
}; class base2
{
public:
void show() // 注意: 不是虚函数
{
std::cout << "base2->show()" << std::endl;
}
}; class baseY: public base2
{
public:
void show()
{
std::cout << "baseY->show()" << std::endl;
}
}; int main()
{
//多态,父类指针可以根据多态转化为子类指针
//子类指针存储一个父类指针,转换失败。指针为 0x00000000
base1 *p1 = new base1;
base1 *p2 = new baseX;
std::cout << "p1 addr: 0x" << p1 << " " << "p2 addr: 0x" << p2 << std::endl;
p1->show();
p2->show(); //typeid:自动识别类型,依赖于虚函数
std::cout << typeid(p2).name() << std::endl; // p1的类型为父类类型指针 class base1 *
std::cout << typeid(*p2).name() << std::endl; // *p1的类型为子类类型 class baseX baseX *px = dynamic_cast<baseX *>(p1); // 使用子类指针存储一个父类指针
std::cout << "px addr: 0x" << (void *)px << std::endl; // 转换失败,px的地址值为0x00000000
// px->show(); // 可以通过编译,但是运行会崩溃 base1 *pb1 = dynamic_cast<base1 *>(p2); // 使用父类指针存储一个子类指针
std::cout << "pb1 addr: 0x" << (void *)pb1 << std::endl; // 转换成功
pb1->show(); std::cout << "===========================================" << std::endl; base2 *p3 = new base2;
base2 *p4 = new baseY;
std::cout << "p3 addr: 0x" << p3 << " " << "p4 addr: 0x" << p4 << std::endl;
p3->show();
p4->show(); //typeid:自动识别类型,依赖于虚函数
std::cout << typeid(p4).name() << std::endl; // p1的类型为父类类型指针 class base2 *
std::cout << typeid(*p4).name() << std::endl; // *p1的类型为子类类型 class base2 // 注意: 这里转换失败,是因为RTTI实时类型检测到p3和py的类型是不一样的,需要进行转换
// 但是dynamic_cast转换只能识别多态数据类型,转换失败就是null
// dynamic_cast:必须要有虚函数才可以转换
//baseY *py = dynamic_cast<baseY *>(p3); // 使用子类指针存储一个父类指针
//std::cout << "py addr: 0x" << (void *)py << std::endl; // 转换失败,px的地址值为0x00000000
//px->show(); // 可以通过编译,但是运行会崩溃 // 注意: 这里转换成功,是因为RTTI实时类型检测到p4和pb2的类型是一样的,无需转换,直接赋值即可
base2 *pb2 = dynamic_cast<base2 *>(p4); // 使用父类指针存储一个父类指针
std::cout << "pb2 addr: 0x" << (void *)pb2 << std::endl; // 转换成功
pb2->show(); //std::cout << "mytest" << std::endl;
system("pause");
return ;
}

运行结果

dynamic_cast 转换示例的更多相关文章

  1. Canvas与Image互相转换示例以及利用该技术实现微信长按自动识别二维码功能

    现在扫描二维码已经很普遍,微信扫一扫即可,但是如果二维码是在自己的手机上呢?那就要用到微信里的一个功能了,手指长按二维码,会弹出自动识别的选项,点确定就可以看到二维码的内容了.那么怎么通过前端实现这个 ...

  2. LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解)

    摘自:https://www.jianshu.com/p/b7e72e585a37 LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解 ...

  3. static_cast与dynamic_cast转换 最简单的理解

    3.1 static_cast用法:static_cast < type-id > ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检 ...

  4. ArcEngine关于单位转换示例

    示例界面: 转换代码: private void Button1_Click(object sender, System.Windows.RoutedEventArgs e) { // Get the ...

  5. Java进制转换示例

    收藏的代码,以备查询之用.进制之间转换都是以十进制作为中间层的. int os = 16; //十进制转成十六进制: Integer.toHexString(os); //十进制转成八进制 Integ ...

  6. byte[]与各种数据类型互相转换示例

    public class TestCase { /** * short到字节数组的转换. */ public static byte[] shortToByte(short number) { int ...

  7. JavaScript数字和字符串转换示例

    http://www.jb51.net/article/48465.htm 1. 数字转换为字符串 a. 要把一个数字转换为字符串,只要给它添加一个空的字符串即可: 复制代码代码如下: var n = ...

  8. Java实现时间日期格式转换示例

    package com.hanqi.util; import java.text.ParseException; import java.text.SimpleDateFormat; import j ...

  9. javascript unicode与GBK2312(中文)编码转换示例

    一个javascript的unicode与GBK2312编码相互转换的方法. 代码: var GB2312UnicodeConverter = {     ToUnicode: function (s ...

随机推荐

  1. oracle 数据库管理员

    一.数据库管理员每个oracle数据库应该至少有一个数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库可能需要多个dba分担不同的管理职责.那么一个数据库管理员的主要 ...

  2. axios 学习笔记

    官方文档地址:https://github.com/axios/axios axios 是一个基于 Promise 的HTTP库,可以用在浏览器和 node.js 中 特性: • 从浏览器发起 XML ...

  3. ch340是什么芯片

    CH340 是一个USB 总线的转接芯片,实现USB 转串口.USB 转IrDA 红外或者USB 转打印口.     在串口方式下,CH340 提供常用的MODEM联络信号,用于为计算机扩展异步串口, ...

  4. canvas,html2canvas等合成图片不清晰问题

    function  pxRa(cxt) { var backingStore = context.backingStorePixelRatio || context.webkitBackingStor ...

  5. TCP/IP(八)之总结ICP/IP四层模型

    前言 在这里有一个问题,有的书上说TCP/IP是四层有的却说是五层.其实这个问题我也上网查了一下资料. tcp/ip是事实标准,分4层.osi模型是国际标准,分7层.讲课的时候,一般把他们综合起来讲, ...

  6. bzoj1968 COMMON 约数研究

    Input只有一行一个整数 N(0 < N < 1000000).Output只有一行输出,为整数M,即f(1)到f(N)的累加和.Sample Input 3 Sample Output ...

  7. SQL server学习(一)数据库的基本知识、基本操作(分离、脱机、收缩、备份、还原、附加)和基本语法

    在软件测试中,数据库是必备知识,共同探讨. 阅读目录 基本知识 数据库发展史 数据库名词 SQL组成 基本操作 登录数据库操作 数据库远程连接操作 数据库分离操作 数据库脱机.联机操作 数据库收缩操作 ...

  8. 使用SQLite做本地数据缓存的思考

    前言 在一个分布式缓存遍地都是的环境下,还讲本地缓存,感觉有点out了啊!可能大家看到标题,就没有想继续看下去的欲望了吧.但是,本地缓存的重要性也是有的! 本地缓存相比分布式缓存确实是比较out和比较 ...

  9. 上传文件没有写权限Access to the path is denied

    Access to the path is denied. asp.net程序目录放在系统盘,ntfs格式. 程序中对cfg.xml有写入操作. 运行的时候出现了这个问题. 在我自己的机器上没有问题 ...

  10. Python selenium 文件自动下载 (自动下载器)

    MyGithub:https://github.com/williamzxl 最新代码已经上传到Github,以下版本为stupid版本. 由于在下载过程中需要下载不同文件,所以可以把所有类型放在Va ...