dynamic_cast
2011-08-11 15:55
85 查看
dynamic_cast<T*> (p)
如果p的类型是T*,或为类型D*且T是D的一个可访问的基类,结果恰如我们直接将p赋值给一个T*。
void f( BB_ival_slider* p ) { Ival_slider* pi1 = p; // ok Ival_slider* pi2 = dynamic_cast<Ival_slider*>( p ); //ok BBslider* pbb1 = p; // error: BBslider是保护的基类 BBslider* pbb2 = dynamic_cast<BBslider*( p ); // ok: pbb2变成0 }
dynamic_cast不能违背对private和protected基类的保护。如果对象属于类T,或者是唯一的类型为T的基类,那么dynamic_cast<T*>(p)就返回指向该对象的类型为T*的指针;否则就返回0。如果p的值为0,dynamic_cast<T*>(p)也返回0。注意,这里要求该转换能唯一确定一个对象。存在着某些情况下被p所指的对象里有不止一个表示类型为T的基类的子对象。
classs My_slider : public Ival_slider { // 多态基类 (Ival_slider有虚函数) // ... } class My_date : public Date { // 基类不是多态类(Date没有虚函数) // ... } void g( Ival_box* pb, Date* pd ) { My_slider* pd1 = dynamic_cast<My_slider*>( pb ); // ok My_date* pd2 = dynamic_cast<My_date*>( pd ); // error: Date不是多态类 }dynamci_cast要求一个到多态类型的指针或者引用,以便做向下强制或者交叉强制。要求指针为多态的,能简化dynamic_cast的实现,因为这将使我们很容易为存储对象的类型信息找到一个位置。一种典型的实现方式是吧一个“类型信息对象”附加到对象上,采用的方式是在这种对象的纯虚函数表里放一个指向类型信息的指针。将dynamic_cast限制到多态类型上也是有意思的。如果一个对象没有纯虚函数,在不知道它的确切类型的情况下就无法安全地对其进行操作。
void f( Ival_box* p, Ival_box& r ) { if ( Ival_slider* is = dynamic_cast<Ival_slider*>( p ) ) { else { } Ival_slider& is = dynamic_cast<Ival_slider&>( r ); } void g( void ) { try { f( new BB_ival_slider, *new BB_ival_slider ); f( new BBdial, *new BBdial ); } catch ( bad_cast ) { } }
如果对引用的dynamic_cast的操作对象不具有所需要的类型,就会抛出一个bad_cast异常。
相关文章推荐
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- <转>标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- dynamic_cast的有效性问题
- C++强制类型转换操作符 dynamic_cast
- 类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast区别
- C++学习笔记:类型转换dynamic)cast和reinterpret_cast
- static_cast、dynamic_cast reinterpret_cast和const_
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- C++ 语法实验室之const_cast,static_cast,dynamic_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- C++ 使用dynamic_cast进行downcast时常会出现的问题 [RTTI]
- C++标准转换运算符dynamic_cast
- C++标准转换运算符dynamic_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- 浅议 Dynamic_cast 和 RTTI
- C++中的四种转换:static_cast、const_cast、reinterpret_cast、dynamic_cast
- C++中dynamic_cast、static_cast 使用说明
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较