dynamic_cast用法

dynamic_cast用法
语法
dynamic_cast<type-name>(expression)
判断是否可以安全地将对象的地址赋给特定类型的指针。如果可以返回地址否则返回空指针。
可以将有继承关系的派生类对象的地址赋给基类指针。即使基类中没有虚函数也可以使用dynamic_cast。如果将没有继承关系的对象的地址赋给另一个类的指针, 编译器会报错。
请看代码

#include<cstdio>
class Base{
  int dat;
public:
  explicit Base(int val) : dat(val){
    printf("%s, this=%p\n", __func__, this);
  }
#if 0
  virtual void act(){
#else
  void act(){
#endif
    printf("%s, this=%p\n", __func__, this);
  }
};
class Sub : public Base{
public:
  explicit Sub(int val) : Base(val){
    printf("%s, this=%p\n", __func__, this);
  }
};
class Other{
  int dat;
public:
  explicit Other(int val) : dat(val){
    printf("%s, this=%p\n", __func__, this);
  }
};
int main(){
  Base obase(1);
  Sub osub(2);
  Base *pbase = NULL;
  if(pbase = dynamic_cast<Base *>(&osub) ){
    pbase->act();
  }
#if 0
  Other oother(3);
  //error: cannot dynamic_cast & oother (of type class Other*) to type class Base* 
  //(source type is not polymorphic)
  if(pbase = dynamic_cast<Base *>(&oother) ){
    //pobj was not declared in this scope   pobj->act();
    pobj->act();
  }
#endif 
}

测试结果
[email protected]:~/project/test/cpp/rtti$ ./a.out
Base, this=0x7fffe85b2ed0
Base, this=0x7fffe85b2ee0
Sub, this=0x7fffe85b2ee0
act, this=0x7fffe85b2ee0

时间: 2024-10-17 23:25:24

dynamic_cast用法的相关文章

dynamic_cast 用法

dynamic_cast 用法语法:dynamic_cast<type-name>(expression)如果 type-name 和 expression 的位数一样,那么就能进行这种转换.dynamic_cast 的安全性完全由程序员控制.C语言的强制类型转换有时会忽略这一限制:转换源与转换目标的位数是否相同.例如,long 可以强制转换为 int,即"长数"强制转换为"短数".char 可以强制转换为 short,即"短数"转换

C++中static_cast, dynamic_cast用法

前言 Android的Framework层源码中有很多强制类型转换函数的调用.写惯了C代码的人一般都习惯下面这种强制转换方式: double a = 89; int b = (int)a; 但是,在C++代码中,不推荐使用C这种(type-id)的强制转换风格代码,更推荐使用C++的标准类型转换符:static_cast和dynamic_cast. static_cast static_cast的函数原型如下: static_cast<type-id>(expression) 说明: 该运算符

【转】C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析

原文链接:http://blog.csdn.net/bzhxuexi/article/details/17021559 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159; ival + dval;//ival被

C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)

在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换(3)避免使用reinterpret_cast和老式的强制类型转换操作符通常,隐式的类型转换会导致警告,需要重视这些警告,并使用显式的类型转换代替,例如static_cast代替一些算术类型转换. 在C++中,对象的类型通常有如下几种:(一)内置类型,如int ,bool ,枚举类型等(二)自定义类型

static_cast, dynamic_cast, const_cast探讨

C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159;ival + dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 int *pi = 0; // 0被转化为int

static_cast, dynamic_cast和reinterpret_cast的区别和应用 [转]

其实不仅仅是一个转载,还是一个融合 今天的一个考题为:#include <iostream>using namespace std; class BClass{public:    BClass(){};    virtual ~BClass(){};    virtual void OutPut(int i){cout<<"BClass::ouput is "<<i<<endl;} };class son1:public BClass{

static_cast, dynamic_cast, const_cast

[C++专题]static_cast, dynamic_cast, const_cast探讨 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159; ival + dval;//ival被提升为doubl

【C++专题】static_cast, dynamic_cast, const_cast探讨

首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. 1 int ival = 3; 2 double dval = 3.14159; 3 4 ival + dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 int

c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿

c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿 虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用.其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用:在方法中定义一个static变量,该变量在程序开始存在直到程序结束:类中定义一个static成员,该成员随类