虚函数 以及dynamic_cast static_cast

1.class Base
{
public:Base(){}
public:
/* virtual*/    void print(){cout<<"Base";}
};


class Derived:public Base
{
public:Derived(){}
public:
    void print(){cout<<"Derived";}
};




int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
   


    Base *point=new Derived();

    point->print();



 // 比较不同to thi


2


dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

class  Base
{
public :
    
int  m_iNum;
    
virtual   void  foo();
};

class  Derived: public  Base
{
public :
    
char   * m_szName[ 100 ];
};

void  func(Base  * pb)
{
    Derived 
* pd1  =  static_cast < Derived  *> (pb);

    Derived 
* pd2  =  dynamic_cast < Derived  *> (pb);
}

在上面的代码段中,
如果pb实际指向一个Derived类型的对象,pd1和pd2是一样的,并且对这两个指针执行Derived类型的任何操作都是安全的;
如果pb实际指向的是一个Base类型的对象,那么pd1将是一个指向该对象的指针,对它进行Derived类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针(即0,因为dynamic_cast失败)。
另外要注意:Base要有虚函数,否则会编译出错;static_cast则没有这个限制。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。

另外, dynamic_cast 还支持交叉转换(cross cast)。如下代码所示。
class  Base
{
public :
    
int  m_iNum;
    
virtual   void  f(){}
};



class  Derived1 :  public  Base
{

};

class  Derived2 :  public  Base
{

};

void  foo()
{
    derived1 
* pd1  =   new  Drived1;

    pd1
-> m_iNum  =   100 ;

    Derived2 
* pd2  =  static_cast < Derived2  *> (pd1);  // compile error

    Derived2 
* pd2  =  dynamic_cast < Derived2  *> (pd1);  // pd2 is NULL

    delete pd1;
}

在函数foo中,使用 static_cast 进行转换是不被允许的,将在编译时出错;而使用  dynamic_cast 的转换则是允许的,结果是空指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值