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的基类的子对象。
dynamci_cast要求一个到多态类型的指针或者引用,以便做向下强制或者交叉强制。要求指针为多态的,能简化dynamic_cast的实现,因为这将使我们很容易为存储对象的类型信息找到一个位置。一种典型的实现方式是吧一个“类型信息对象”附加到对象上,采用的方式是在这种对象的纯虚函数表里放一个指向类型信息的指针。将dynamic_cast限制到多态类型上也是有意思的。如果一个对象没有纯虚函数,在不知道它的确切类型的情况下就无法安全地对其进行操作。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不是多态类 }
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异常。
dynamic_cast
最新推荐文章于 2022-05-19 22:34:32 发布