当前位置: 首页 > news >正文

C++中dynamic_cast

#include <iostream>
using namespace std;


class Person
{
public:
	int m_a;
};

class Student
{
public:
	int m_b;
};

int main()
{
	Person p;
	Student s;

	Person* p1 = &p;
	Student* s1 = &s;

	//Student *s3 = static_cast<Student*>(p1); //编译时就检测,不能转换
	Student *s2 = (Student*)(p1); //父类转子类,可以但是越界访问了,严重的会引起崩溃,因为父类没有子类的属性m_b
	s2->m_b = 2;

	return 0;
}

dynamic_cast

#include <iostream>
using namespace std;


class Person
{
public:
	virtual void SayHello()
	{
	}
	int m_a;
};

class Student
{
public:
	virtual void SayHello()
	{
	}
	int m_b;
};

int main()
{
	Person p;
	Student s;

	Person* p1 = &p;
	Student* s1 = &s;

	//编译是通过的,运行时检测是否真正转换成功
	//此时p1位父类指针,将父类指针转换为子类指针,这里得到的是nullptr,即转换不成功,避免了可能的崩溃
	//此外,dynamic_cast,还要要求,父类有虚函数,才行否则编译时就报错了。
	//也就是说,dynamic_cast用于运行时检测,指针之间是否转换成功,这样就安全了一点。
	Student *s2 = dynamic_cast<Student*>(p1); 
	if (s2 != nullptr)
	{
		cout << "succeed" << endl;
	}

	return 0;
}


相关文章:

  • 数据结构-反转链表
  • lua中rawget和rawset
  • Linux红黑树(二)——访问节点
  • lua中继承
  • SPOJ REPEATS Repeats (后缀数组:子串的最大循环节)题解
  • lua在什么时候设置元表失败呢
  • lua中通过__index继承父类的属性
  • C++中匿名函数的捕获列表和匿名函数的说明
  • lua中通过__index继承父类的方法
  • lua中函数闭包
  • Entity Framework加载相关实体——Lazy Loading
  • C++函数对象包装器std::function
  • cygwin 安装
  • shell 1
  • C#中FileStream——循环RingBuffer
  • .pyc 想到的一些问题
  • Debian下无root权限使用Python访问Oracle
  • Java方法详解
  • java小心机(3)| 浅析finalize()
  • nfs客户端进程变D,延伸linux的lock
  • oschina
  • python3 使用 asyncio 代替线程
  • Sass 快速入门教程
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 从setTimeout-setInterval看JS线程
  • 订阅Forge Viewer所有的事件
  • 回顾2016
  • 前端学习笔记之观察者模式
  • 学习JavaScript数据结构与算法 — 树
  • 因为阿里,他们成了“杭漂”
  • No resource identifier found for attribute,RxJava之zip操作符
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 阿里云服务器购买完整流程
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # C++之functional库用法整理
  • #AngularJS#$sce.trustAsResourceUrl
  • #define
  • #Linux(权限管理)
  • #宝哥教你#查看jquery绑定的事件函数
  • (2)(2.10) LTM telemetry
  • (27)4.8 习题课
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (搬运以学习)flask 上下文的实现
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)elasticsearch 源码之启动流程分析
  • (十一)手动添加用户和文件的特殊权限
  • (新)网络工程师考点串讲与真题详解
  • (译) 函数式 JS #1:简介
  • (译)2019年前端性能优化清单 — 下篇