您的位置:首页 > 编程语言 > C语言/C++

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

2014-02-21 12:56 447 查看
#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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++