dynamic_cast 转换示例
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 转换示例的更多相关文章
- Canvas与Image互相转换示例以及利用该技术实现微信长按自动识别二维码功能
现在扫描二维码已经很普遍,微信扫一扫即可,但是如果二维码是在自己的手机上呢?那就要用到微信里的一个功能了,手指长按二维码,会弹出自动识别的选项,点确定就可以看到二维码的内容了.那么怎么通过前端实现这个 ...
- LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解)
摘自:https://www.jianshu.com/p/b7e72e585a37 LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解 ...
- static_cast与dynamic_cast转换 最简单的理解
3.1 static_cast用法:static_cast < type-id > ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检 ...
- ArcEngine关于单位转换示例
示例界面: 转换代码: private void Button1_Click(object sender, System.Windows.RoutedEventArgs e) { // Get the ...
- Java进制转换示例
收藏的代码,以备查询之用.进制之间转换都是以十进制作为中间层的. int os = 16; //十进制转成十六进制: Integer.toHexString(os); //十进制转成八进制 Integ ...
- byte[]与各种数据类型互相转换示例
public class TestCase { /** * short到字节数组的转换. */ public static byte[] shortToByte(short number) { int ...
- JavaScript数字和字符串转换示例
http://www.jb51.net/article/48465.htm 1. 数字转换为字符串 a. 要把一个数字转换为字符串,只要给它添加一个空的字符串即可: 复制代码代码如下: var n = ...
- Java实现时间日期格式转换示例
package com.hanqi.util; import java.text.ParseException; import java.text.SimpleDateFormat; import j ...
- javascript unicode与GBK2312(中文)编码转换示例
一个javascript的unicode与GBK2312编码相互转换的方法. 代码: var GB2312UnicodeConverter = { ToUnicode: function (s ...
随机推荐
- 纯css隐藏移动端滚动条解决方案(ios上流畅滑动)
纯css隐藏移动端滚动条解决方案(ios上流畅滑动) html代码展示(直接复制代码保存至本地文件运行即可): <!DOCTYPE html> <html lang="en ...
- 再起航,我的学习笔记之JavaScript设计模式26(解释器模式)
解释器模式 概念介绍 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 获取元素在页面中的路径 我们都知道获取一个 ...
- 关于数据库中datareader的用法
1.C#中提供的DataReader可以从数据库中每次提取一条数据. using System; using System.Collections.Generic; using System.Comp ...
- 开博近一年的感想 by 程序员小白
/* 好吧,这里的写博客应该理解为更宏观的写文章. */ 在去年的这个时候,我所知道的平台只有 CSDN 和博客园..然而 CSDN 的广告实在是不想吐槽了,选择博客园是一件非常自然的事情.要说开 ...
- SYSTEM_INFO
SYSTEM_INFO结构体包含了当前计算机的信息.这个信息包括计算机的体系结构.中央处理器的类型.系统中中央处理器的数量.页面的大小以及其他信息. SYSTEM_INFO,Win32 API函数Ge ...
- 【转】TCP/IP协议中TCP和UDP的区别
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- 洗礼灵魂,修炼python(8)--高效的字典
python几大核心之--字典(dict) 1.什么是字典 学生时代都用过字典吧?用这个字的读音,偏旁就能用字典查到其相关信息,词性,意思,组词,造句,还有在什么场合下用这个字等等的. 在python ...
- 分享基于分布式Http长连接框架--架构模型
我画了个简单的架构图来帮助说明: 其实为发布订阅架构模式. 生产者和消费者我们统一可理解为客户端,消息中间件可认为是服务端. 生产者和消费者做为客户端要跟服务端交互,则先通过代理订阅服务端,订阅成功后 ...
- JavaWeb(七)之详解JavaWeb路径
前言 在我们的实际开发中,经常要写路径,不管是链接,重定向还是转发,这都是需要路径的.那这一篇我给大家详细的分享一下Web中的各种路径问题. 世界上一切东西都是相对的,对于这点而言,相信大家并不陌生, ...
- 我的第一个python web开发框架(7)——本地部署前端访问服务器
PS:本系列内容进度节奏会放的很慢,每次知识点都尽量少一点,这样大家接触的知识点少了,会更容易理解,因为少即是多.另外,对于后面代码部分,虽然尽量不用那些复杂的封装和类,但它并不表示看了就能全部记住, ...