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. 专用管理连接(DAC)和单用户模式

    数据库运维人员,在维护数据库时,有时会遇到一些特殊的情况,例如,SQL Server实例无法访问,此时需要用到管理员在紧急情况下专用的连接:有时,在做一些系统级别的配置修改时,当前数据库不能被其他用户 ...

  2. OpenStack Ocata 超详细搭建文档

    前言 搭建前必须看我本文档搭建的是分布式O版openstack(controller+ N compute + 1 cinder)的文档.openstack版本为Ocata.搭建的时候,请严格按照文档 ...

  3. ASP.NET Core 认证与授权[1]:初识认证

    在ASP.NET 4.X 中,我们最常用的是Forms认证,它既可以用于局域网环境,也可用于互联网环境,有着非常广泛的使用.但是它很难进行扩展,更无法与第三方认证集成,因此,在 ASP.NET Cor ...

  4. SpringBoot开发案例之mail中文附件乱码

    前一段时间做过一个邮件发送的服务,以前大体都测试过,文本.图片.附件都是没有问题的,可有同事反应发送的附件名称有中文乱码,类似如下截图展示: 咋一看不像乱码,抱着试试看的态度,为MimeMessage ...

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

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

  6. spring cloud+dotnet core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  7. Java历程-初学篇 Day05选择结构(2)

    一,switch 由于本作者学的是jdk6.0版本,我知道7.0可以使用字符串,但是我就不改了 语法: switch(char类型/int类型){ case 值: //输出 break; ... de ...

  8. 使用路由延迟加载 Angular 模块

    使用路由延迟加载 Angular 模块 Angular 非常模块化,模块化的一个非常有用的特性就是模块作为延迟加载点.延迟加载意味着可以在后台加载一个模块和其包含的所有组件等资源.这样 Angular ...

  9. Python自学笔记-map和reduce函数(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内 ...

  10. JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)

    函数节流,简单地讲,就是让一个函数无法在很短的时间间隔内连续调用,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用. 函数节流的原理挺简单的,估计大家都想到了,那就是定时器.当我 ...