一个简单的例子说明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/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解
- C++中引用(&)的用法与应用实例分析
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 探讨C++中数组名与指针的用法比较分析
- 深入解析C++中的引用类型
- C++可变参数的实现方法
- C++中的常对象与常对象成员详解