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. E - 钱币兑换问题

          在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input每行只有一个正整数N,N小于32768. Output对应每个输入,输出兑换方 ...

  2. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---线程优先权(Thread priority)

    有没有过这样的经验?你坐在你的车子里,目的地还在好几公里之遥,而时间已经很晚了.你拼命想告诉那些挡住你去路的人们,今天这个约会对你是多么多么重要,能不能请他们统统--呃--滚到马路外?很不幸,道路系统 ...

  3. win7旗舰版最新激活密钥

    Win7旗舰.企业.专业版的激活密钥(32位.64位均可用).FJGCP-4DFJD-GJY49-VJBQ7-HYRR2 AcerVQ3PY-VRX6D-CBG4J-8C6R2-TCVBD Alien ...

  4. 【转】常用Maven插件

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  5. 【TOMCAT启动异常】The BASEDIR environment variable is not defined correctly

    <span style="font-size:18px;">The BASEDIR environment variable is not defined correc ...

  6. HIT 1917 Peaceful Commission

    这道题题意就是给你n对人,一对中编号为x,x+1,给你m对矛盾,表示这两个人不能同时选. 然后就是Two-Sat的模板题了,就是根据对称性,连边,加缩点,最后拓扑排序,求出一组可行解就可以了. #in ...

  7. 《算法导论》学习总结 — XX.第22章 图的基本算法

    BFS(广搜): 广搜就是广度优先搜索,根据名字可以知道,是通过广度来遍历图,也就是层次遍历吧. 在这里以及下面的DFS(深搜),都用到了颜色WHITE,GRAY,BLACK,不过作用不同,具体分别再 ...

  8. combobox数据获取及使用总结

    写在前面 和队友完成工程实践项目过程中遇到combobox数据项加载失败的问题,我将记录下解决该问题中不断填坑的过程. 这是可以确定的填写正确的combobox内容 action也没有错误,Strut ...

  9. python中with学习

    python中with是非常强大的一个管理器,我个人的理解就是,我们可以通过在我们的类里面自定义enter(self)和exit(self,err_type,err_value,err_tb)这两个内 ...

  10. 程序员网站开发时应该注意的SEO问题

    一.链接的统一性 搜索引擎排名最主要的因素就是网站内容和链接,假如网站内部链接不一致,在很大程度上直接影响着网站在搜索引擎中的排名.例如彩票专营店导航栏中的“首页”链接,程序员在开发时可能会有以下几种 ...