dynamic_cast 动态强制类型转换

dynamic_cast必须要有虚函数才能进行转换,static_cast静态转换,不安全。)

运行时类型信息通过运算符dynamic_cast来提供。Dynamic_cast用来向下转型,将基类指针转换为派生类指针.(把基类指针转换为派生类指针)

运算符dynamic_cast<T*>ptr)用来将一个指针类型转换为另外一个指针类型。它经常用来检查一个基类指针是否实际指向的是派生类对象。

ptr类型指针向下转型为T*(基类ptr指向父类派生类T*

什么时候应必须使用dynamic_cast

什么时候dynamic_cast可以使用static_cast代替?

#include"stdafx.h"

#include<iostream>

usingnamespacestd;

classBase

{

public:

virtual voidf(){cout<<"Base::f"<<endl;}

voidf1(){cout<<"Base::f1"<<endl;}

private:

doublex;

doubley;

};

classDerived:publicBase  //单继承

{

public:

virtual voidf(){cout<<"Derived::f"<<endl;}

virtual voidk(){cout<<"Derived::k"<<endl;}

private:

doublez;

};

classBase1

{

public:

virtual voidg(){cout<<"Base1::g"<<endl;}

voidg1(){cout<<"Base1::g1"<<endl;}

};

classDerived1:publicBase,publicBase1   //多重继承

{

public:

virtual voidf(){cout<<"Derived1::f"<<endl;}

virtual voidh(){cout<<"Derived1::h"<<endl;}

};

voidTest1()

{

//对于单继承,

//如果pD真的指向Derived,用dynamic_caststatic_cast效果相同

Base*pD=newDerived;

Derived*pD1=dynamic_cast<Derived*>(pD);

pD1->f();

pD1->k();

pD1->f1();

Derived*pD2=static_cast<Derived*>(pD);

pD2->f();

pD2->k();

pD2->f1();

//但是如果pB不是真的指向Derived,则用dynamic_cast则返回NULL,能够更早的禁止error的发生,

//如果用static_cast虽然返回的不为NULL,但是运行时可能抛出exception

/**/Errorcode

//Base*pB=newBase();

//Derived*pD3=static_cast<Derived*>(pB);

//pD3->f();

//pD3->k();

//pD3->f1();

//Derived*pD4=dynamic_cast<Derived*>(pB);

//pD4->f();

//pD4->k();

//pD4->f1();

}

voidTest2()

{

//对于多重继承,

//如果pD真的指向的是Derived1,使用dynamic_caststatic_cast都可以转化为Derived1

//但是如果要转化为Base的兄弟类Base1,必须使用dynamic_cast,使用static_cast不能编译。

Base*pD=newDerived1;

Derived1*pD1=dynamic_cast<Derived1*>(pD);

pD1->f();

pD1->h();

pD1->f1();

Base1*pB1=dynamic_cast<Base1*>(pD);

pB1->g();

Derived1*pD2=static_cast<Derived1*>(pD);

pD2->f();

pD1->h();

pD2->f1();

/**/errorcannotcompiler

//Base1*pB2=static_cast<Base1*>(pD);

//pB2->g();

//当然对于pB不是真的指向Derived1,想要转化为Derived1Base的兄弟类Base1,情况与Test1中的error情况相同。

}

int_tmain(intargc,_TCHAR*argv[])

{

Test1();

Test2();

return0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值