dynamic_cast
来源:互联网 发布:电影 人工智能怎样评价 编辑:程序博客网 时间:2024/06/06 05:53
dynamic_cast使用的讨论
一 问题
1)什么时候应必须使用dynamic_cast
2)什么时候dynamic_cast可以使用static_cast代替
二 实例
1)什么时候应必须使用dynamic_cast
2)什么时候dynamic_cast可以使用static_cast代替
二 实例
// TestCast.cpp : Defines the entry point for the console application.
//
#include"stdafx.h"
#include<iostream>
usingnamespace std;
class Base
{
public:
virtual void f() { cout<< "Base::f"<< endl; }
void f1(){cout<< "Base::f1"<< endl;}
private:
double x;
double y;
};
class Derived :public Base
{
public:
virtual void f(){cout<< "Derived::f"<< endl; }
virtual void k(){cout<< "Derived::k"<< endl; }
private:
double z;
};
class Base1
{
public:
virtual void g(){ cout<< "Base1::g"<< endl;}
void g1(){cout<< "Base1::g1"<< endl;}
};
class Derived1 :public Base,public Base1
{
public:
virtual void f(){ cout<< "Derived1::f"<< endl;}
virtual void h(){ cout<< "Derived1::h"<< endl;}
};
void Test1()
{
// 对于单继承,
// 如果PD真的指向Derived,用dynamic_cast和static_cast效果相同
Base*pD = new Derived;
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。
//// Error code
//Base *pB = new Base();
//Derived *pD3 = static_cast<Derived*>(pB);
//pD3->f();
//pD3->k();
//pD3->f1();
//Derived *pD4 = dynamic_cast<Derived*>(pB);
//pD4->f();
//pD4->k();
//pD4->f1();
}
void Test2()
{
// 对于多重继承,
// 如果PD真的指向的是Derived1,使用dynamic_cast和static_cast都可以转化为Derived1,
// 但是如果要转化为Base的兄弟类Base1,必须使用dynamic_cast,使用static_cast不能编译。
Base*pD = new Derived1;
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();
//// error can not compiler
//Base1 *pB2 = static_cast<Base1*>(pD);
//pB2->g();
// 当然对于PB不是真的指向Derived1,想要转化为Derived1或Base的兄弟类Base1,情况与Test1中的error情况相同。
}
int _tmain(int argc, _TCHAR* argv[])
{
Test1();
Test2();
return 0;
}
//
#include"stdafx.h"
#include<iostream>
usingnamespace std;
class Base
{
public:
virtual void f() { cout<< "Base::f"<< endl; }
void f1(){cout<< "Base::f1"<< endl;}
private:
double x;
double y;
};
class Derived :public Base
{
public:
virtual void f(){cout<< "Derived::f"<< endl; }
virtual void k(){cout<< "Derived::k"<< endl; }
private:
double z;
};
class Base1
{
public:
virtual void g(){ cout<< "Base1::g"<< endl;}
void g1(){cout<< "Base1::g1"<< endl;}
};
class Derived1 :public Base,public Base1
{
public:
virtual void f(){ cout<< "Derived1::f"<< endl;}
virtual void h(){ cout<< "Derived1::h"<< endl;}
};
void Test1()
{
// 对于单继承,
// 如果PD真的指向Derived,用dynamic_cast和static_cast效果相同
Base*pD = new Derived;
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。
//// Error code
//Base *pB = new Base();
//Derived *pD3 = static_cast<Derived*>(pB);
//pD3->f();
//pD3->k();
//pD3->f1();
//Derived *pD4 = dynamic_cast<Derived*>(pB);
//pD4->f();
//pD4->k();
//pD4->f1();
}
void Test2()
{
// 对于多重继承,
// 如果PD真的指向的是Derived1,使用dynamic_cast和static_cast都可以转化为Derived1,
// 但是如果要转化为Base的兄弟类Base1,必须使用dynamic_cast,使用static_cast不能编译。
Base*pD = new Derived1;
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();
//// error can not compiler
//Base1 *pB2 = static_cast<Base1*>(pD);
//pB2->g();
// 当然对于PB不是真的指向Derived1,想要转化为Derived1或Base的兄弟类Base1,情况与Test1中的error情况相同。
}
int _tmain(int argc, _TCHAR* argv[])
{
Test1();
Test2();
return 0;
}
- dynamic_cast
- Dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- dynamic_cast
- HibernateTemplate源码
- httclient出现的entity consumed
- WebView在ViewFlipper中 实现 切换
- Python中的easy_install
- 1000以内素数
- dynamic_cast
- Java 判断文件夹是否存在、创建文件夹
- 从“Hello World”看iOS应用的生命周期
- Windows服务(四)
- Lisp语言:Do循环的使用
- 我的Qt 4.4.0 X86配置
- 20121129东方网力笔试题
- MFC应用程序接收命令行参数的实现
- progressview