dynamic_cast

dynamic_cast使用的讨论 

 

一 问题
1)什么时候应必须使用dynamic_cast
2)什么时候dynamic_cast可以使用static_cast代替

二 实例
dynamic_cast使用的讨论 - Maosth - Maosth 的博客 // TestCast.cpp : Defines the entry point for the console application.
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
//
dynamic_cast使用的讨论 - Maosth - Maosth 的博客

dynamic_cast使用的讨论 - Maosth - Maosth 的博客#include
" stdafx.h "
dynamic_cast使用的讨论 - Maosth - Maosth 的博客#include
< iostream >
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
using namespace std;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
class Base
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
{
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
public:
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
virtual void f() { cout << "Base::f" << endl; }
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
void f1(){cout << "Base::f1" << endl;}
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
private:
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
double x;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
double y;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客}
;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
class Derived : public Base
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
{
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
public:
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
virtual void f(){cout << "Derived::f" << endl; }
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
virtual void k(){cout << "Derived::k" << endl; }
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
private:
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
double z;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客}
;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
class Base1
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
{
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
public:
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
virtual void g(){ cout << "Base1::g" << endl;}
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
void g1(){cout << "Base1::g1" << endl;}
dynamic_cast使用的讨论 - Maosth - Maosth 的博客}
;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
class Derived1 : public Base, public Base1
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
{
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
public:
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
virtual void f(){ cout << "Derived1::f" << endl;}
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
virtual void h(){ cout << "Derived1::h" << endl;}
dynamic_cast使用的讨论 - Maosth - Maosth 的博客}
;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
void Test1()
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
{
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
// 对于单继承,
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
// 如果PD真的指向Derived,用dynamic_cast和static_cast效果相同
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
    Base *pD = new Derived;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    Derived
*pD1 = dynamic_cast<Derived*>(pD);
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD1
->f();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD1
->k();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD1
->f1();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    Derived
*pD2 = static_cast<Derived*>(pD);
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD2
->f();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD2
->k();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD2
->f1();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
// 但是如果PB不是真的指向Derived,则用dynamic_cast则返回NULL,能够更早的禁止error的发生,
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
// 如果用static_cast虽然返回的不为NULL,但是运行时可能抛出exception。
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
    //// Error code
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    //Base *pB = new Base();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//Derived *pD3 = static_cast<Derived*>(pB);
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//pD3->f();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//pD3->k();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//pD3->f1();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//Derived *pD4 = dynamic_cast<Derived*>(pB);
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//pD4->f();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//pD4->k();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//pD4->f1();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
}

dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
void Test2()
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
{
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
// 对于多重继承,
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
// 如果PD真的指向的是Derived1,使用dynamic_cast和static_cast都可以转化为Derived1,
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
// 但是如果要转化为Base的兄弟类Base1,必须使用dynamic_cast,使用static_cast不能编译。
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
    Base *pD = new Derived1;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    Derived1
*pD1 = dynamic_cast<Derived1*>(pD);
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD1
->f();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD1
->h();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD1
->f1();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    Base1
*pB1 = dynamic_cast<Base1*>(pD);
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pB1
->g();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    Derived1
*pD2 = static_cast<Derived1*>(pD);
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD2
->f();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD1
->h();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    pD2
->f1();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//// error can not compiler
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    //Base1 *pB2 = static_cast<Base1*>(pD);
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
//pB2->g();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
// 当然对于PB不是真的指向Derived1,想要转化为Derived1或Base的兄弟类Base1,情况与Test1中的error情况相同。
dynamic_cast使用的讨论 - Maosth - Maosth 的博客

dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客}

dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
int _tmain( int argc, _TCHAR * argv[])
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
{
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    Test1();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客    Test2();
dynamic_cast使用的讨论 - Maosth - Maosth 的博客
dynamic_cast使用的讨论 - Maosth - Maosth 的博客   
return 0;
dynamic_cast使用的讨论 - Maosth - Maosth 的博客}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值