一个简单的例子说明dynamic_cast的作用

#include <iostream>
#include <assert.h>

using namespace std;

// 我是父类
class Tfather
{
public:
	virtual void f() { cout << "father's f()" << endl; }
};

// 我是子类
class Tson : public Tfather
{
public:
	void f() { cout << "son's f()" << endl; }

	int data; // 我是子类独有成员
};

int main()
{ 
	Tfather father;
	Tson son;
	son.data = 123;

	Tfather *pf;
	Tson *ps;
	
	/* 上行转换:没有问题,多态有效 */
	ps = &son;
	pf = dynamic_cast<Tfather *>(ps);
	pf->f();

	/* 下行转换(pf实际指向子类对象):没有问题 */
	pf = &son;
	ps = dynamic_cast<Tson *>(pf);
	ps->f();
	cout << ps->data << endl;		// 访问子类独有成员有效

	/* 下行转换(pf实际指向父类对象):含有不安全操作,dynamic_cast发挥作用返回NULL */
	pf = &father;
	ps = dynamic_cast<Tson *>(pf);
	assert(ps != NULL);			 	// 违背断言,阻止以下不安全操作
	ps->f();
	cout << ps->data << endl;		// 不安全操作,对象实例根本没有data成员

	/* 下行转换(pf实际指向父类对象):含有不安全操作,static_cast无视 */
	pf = &father;
	ps = static_cast<Tson *>(pf);
	assert(ps != NULL);
	ps->f();
	cout << ps->data << endl;		// 不安全操作,对象实例根本没有data成员

	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值