dynamic_cast和static_cast
2015-07-18 16:47
267 查看
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。类层次间进行上下行转换时,dynamic_cast和static_cast的效果时一样的;在进行下行转换时,dynamic_cast具有类型检查功能,比static_cast安全。
class Base
{
public:
int m_iNum;
vitual void foo();
};
class Derived :public Base
{
public:
char*m_szName[100];
}
void fun(Base* pb)
{
Derived *pb1=static_cast<Derived*>(pb);
Derived *pb2=dynamic_cast<Derived*>(pb);
如果pb实际指向一个Derived类型的对象,pb1和pd2一样,并且两个指针执行Derived类型的任何操作都是安全的。
如果pb实际指向的是一个Base类型的对象,那么pd1将是一个指向该对象的指针,对它进行Derived类型的操作是不安全的,而pd2将是一个空指针(即0,因为dynamic_cast失效)。
另外,Base要有虚函数,否则会出错;static_cast则没有这个限制。这是由于运行类型检查需要运行时类型信息,而这个信息存储在虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数表的类是没有虚函数表的。
且dynamic还支持交叉转换(不同子类之间的转换
4000
),结构是空指针。
class Base
{
public:
int m_iNum;
vitual void foo();
};
class Derived :public Base
{
public:
char*m_szName[100];
}
void fun(Base* pb)
{
Derived *pb1=static_cast<Derived*>(pb);
Derived *pb2=dynamic_cast<Derived*>(pb);
如果pb实际指向一个Derived类型的对象,pb1和pd2一样,并且两个指针执行Derived类型的任何操作都是安全的。
如果pb实际指向的是一个Base类型的对象,那么pd1将是一个指向该对象的指针,对它进行Derived类型的操作是不安全的,而pd2将是一个空指针(即0,因为dynamic_cast失效)。
另外,Base要有虚函数,否则会出错;static_cast则没有这个限制。这是由于运行类型检查需要运行时类型信息,而这个信息存储在虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数表的类是没有虚函数表的。
且dynamic还支持交叉转换(不同子类之间的转换
4000
),结构是空指针。
相关文章推荐
- android:How to delete a module in Android Studio?
- SimpleAdapter在GridView中运用实例
- MySQL DBA的基础面试题目
- 从头开始学习 Dojo,第 1 部分: 开始 Dojo 开发
- 一起talk C栗子吧(第二十回:C语言实例--括号匹配)
- Codeforces Beta Round #19 D. Points
- <转>如何在CentOS 5/6上安装EPEL 源
- Project Euler:Problem 76 Counting summations
- VC 获取任务栏窗口的句柄
- 计算机意外地重新启动或遇到错误。Windows 安装无法继续。若要安装Windows,请单击“确定”重新启动计算机,然后重新启动安装”。
- 用Maven整合SpringMVC+Spring+Hibernate 框架
- MySQL学习笔记——增删改查
- android view构造函数研究
- REdis数据结构服务器
- [转]java-Three Rules for Effective Exception Handling
- <转>提高iOS开发效率的方法和工具
- Memcached入门一
- 【暑假】[ 图论 ] MST、最短路总结
- 第三方登录之微信登录
- 【Cocos2d-x】CCArray