c++ 38 RTTI ,dynamic_cast ,typeid
来源:互联网 发布:淘宝 日语 编辑:程序博客网 时间:2024/05/17 01:15
dynamic_cast 的用法
#include <iostream>#include <string>using namespace std;class Shape{ public: virtual void Draw()=0;//只要有一个虚函数,这个类就是抽象类 而这里去掉virtual 则会调用基类Draw /*void Draw() { cout<<"Shape Draw"<<endl; }*/ virtual ~Shape()//这样不回产生内存泄漏问题 会调用派生类析构函数,然后调用基类析构函数 { cout<<"~Shape.."<<endl; } }; class Circle:public Shape { public: void Draw() { cout<<"Circle Draw"<<endl; } ~Circle() { cout<<"~Circle"<<endl; } }; class Square:public Shape { public: void Draw() { cout<<"Square Draw"<<endl; } ~Square() { cout<<"~Square"<<endl; } }; int main(){Shape* p;Circle c;p=&c;//基类指针指向派生类对象p->Draw();//掉用派生类虚函数if(dynamic_cast<Circle*>(p)){//运行时识别是Circle 对象 类型安全的向下转型。cout<<"p is point to a circle object"<<endl;Circle* cp=dynamic_cast<Circle*>(p);//安全向下转型cp->Draw();//这种方式 要比虚函数多态调用 大一些 要在编译器中开启一个选项//c++ 语言 下 启动运行时类型信息//如果没有虚函数 是不允许的。 这两个显示 1,开启支持,2,virtual 函数}else if(dynamic_cast<Square*>(p)){cout<<"p is point to a Square object"<<endl;}else{ cout<<"p is point to other object"<<endl;}//static_cast 用在编译器认可的转型//reinterpret_cast 用在编译器 不可认的转型//const_cast 去除常量限定//dynamic_cast 安全的向下转型。return 0;}
type id
#include <iostream>#include <string>using namespace std;class Shape{ public: virtual void Draw()=0;//只要有一个虚函数,这个类就是抽象类 而这里去掉virtual 则会调用基类Draw /*void Draw() { cout<<"Shape Draw"<<endl; }*/ virtual ~Shape()//这样不回产生内存泄漏问题 会调用派生类析构函数,然后调用基类析构函数 { cout<<"~Shape.."<<endl; } }; class Circle:public Shape { public: void Draw() { cout<<"Circle Draw"<<endl; } ~Circle() { cout<<"~Circle"<<endl; } }; class Square:public Shape { public: void Draw() { cout<<"Square Draw"<<endl; } ~Square() { cout<<"~Square"<<endl; } }; int main(){Shape* p;Circle c;p=&c;//基类指针指向派生类对象p->Draw();//掉用派生类虚函数if(dynamic_cast<Circle*>(p)){//运行时识别是Circle 对象 类型安全的向下转型。cout<<"p is point to a circle object"<<endl;Circle* cp=dynamic_cast<Circle*>(p);//安全向下转型cp->Draw();//这种方式 要比虚函数多态调用 大一些 要在编译器中开启一个选项//c++ 语言 下 启动运行时类型信息//如果没有虚函数 是不允许的。 这两个显示 1,开启支持,2,virtual 函数}else if(dynamic_cast<Square*>(p)){cout<<"p is point to a Square object"<<endl;}else{ cout<<"p is point to other object"<<endl;}//static_cast 用在编译器认可的转型//reinterpret_cast 用在编译器 不可认的转型//const_cast 去除常量限定//dynamic_cast 安全的向下转型。//typeid 运算符 返回的是type_info 对象//用在对象上 cout<<typeid(*p).name()<<endl;//打印的是class Circle //指定类型上 cout<<typeid(Circle).name()<<endl;//打印的是class Circle if(typeid(Circle).name()==typeid(*p).name()) { cout<<"===p is point to a circle object===="<<endl;//Circle* cp=dynamic_cast<Circle*>(p);//安全向下转型//cp->Draw(); ((Circle*)p)->Draw(); }else if(typeid(Square).name()==typeid(*p).name()) { cout<<"p is point to a Square object====="<<endl; ((Square*)p)->Draw(); //reinterpret_caset 不作任何对齐操作 //() 还是会做一些对齐操作 }else{ cout<<"p is point to other object=="<<endl; } //通过type_id 也可以做到运行时类型识别return 0;}
0 0
- c++ 38 RTTI ,dynamic_cast ,typeid
- RTTI(dynamic_cast与typeid)
- RTTI, dynamic_cast, typeid
- RTTI(typeid、dynamic_cast)
- RTTI中dynamic_cast和typeid
- C++的RTTI(dynamic_cast与typeid)
- C++ 运行时类型识别RTTI typeid<->dynamic_cast
- RTTI运行时类型识别typeid,type_info,dynamic_cast关建字
- dynamic_cast typeid
- RTTI特性小究(dynamic_cast转换操作符和typeid操作符)
- (转)RTTI特性小究(dynamic_cast转换操作符和typeid操作符)
- 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
- 三十三、RTTI(runtime type information)、dynamic_cast运算符、typeid运算符、type_info
- 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
- C++ RTTI特性:typeid/dynamic_cast及常用四种类型转换运算符
- C++学习之多态篇(运行时类型识别--RTTI(typeid和dynamic_cast))
- 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
- C++ RTTI(typeid)
- 【原】软件工程总概(1)
- JS实现同时存在两个漂浮广告在网页中浮动
- 96A - Football
- 1.4 图解--数学领域
- codeforces 488B Candy Boxes
- c++ 38 RTTI ,dynamic_cast ,typeid
- ALtera中FPGA器件型号含义
- Django 403错误:CSRF verification failed. Request aborted.
- 金现代实习,关于电力站口厂站计量点的部分知识
- 得到的得到的得到的得到的答复都是
- 2颗星星+纯CSS实现星星评分交互效果
- Linux启动gdb调试模式
- 链表+POSIX信号量+条件变量实现的闹铃V1
- 用NSIS折腾一个监控客户端的windows安装包