dynamic_cast<type>()转型与typeid()的使用
来源:互联网 发布:先付款钱在淘宝上 编辑:程序博客网 时间:2024/05/20 18:01
按照c++之父的经典之作 c++程序设计语言的说法
dynamic_cast<type>()可以把基类的指针转化为子类的指针,代码如下:
#include<iostream>#include<string>using namespace std;class Person{public: Person(string name,int age){ this->name=name; this->age=age; } virtual void show(){ cout<<name<<" "<<age<<endl; } virtual ~Person(){}private: string name; int age;};class Student: public Person{public: Student(string name1,int age1,string num1):Person(name1,age1),num(num1){} void show(){ Person::show(); cout<<num<<endl; } ~Student(){}private: string num;};int main(){ Person *p; Person ss("zhang",22); p=&ss; Student *s=dynamic_cast<Student*>(p); if(s==0){ cout<<"NULL POINTER"<<endl; }else{ cout<<"IT IS NOT NULL POINTER"<<endl; } //s->show(); system("pause"); return 0;}
以上的代码理论上是可以运行的,但是输出结果为 NULL POINTER,为什么呢?哪位仁兄可以指点一二,哪里出问题了,小弟感激不尽。
typeid()则可以用来判断类型是否一致,typeid().name()可以返回类型,代码如下
#include<iostream>#include<string>using namespace std;class Person{public: Person(string name,int age){ this->name=name; this->age=age; } virtual void show(){ cout<<name<<" "<<age<<endl; } virtual ~Person(){}private: string name; int age;};class Student: public Person{public: Student(string name1,int age1,string num1):Person(name1,age1),num(num1){} void show(){ Person::show(); cout<<num<<endl; } ~Student(){}private: string num;};int main(){ Person p("zhang",22); Person pp("li",21); Student ss("wangwu",25,"091150"); if(typeid(p)==typeid(pp)){ cout<<"p,pp类型相同"<<endl; }else{ cout<<"p,pp类型不相同"<<endl; } if(typeid(p)==typeid(ss)){ cout<<"p,ss类型相同"<<endl; }else{ cout<<"p,ss类型不相同"<<endl; } int a=100; cout<<"a的类型为"<<typeid(a).name()<<endl; cout<<"p的类型为"<<typeid(p).name()<<endl; system("pause"); return 0;}
欢迎回帖,第一个代码问题出在哪里,为什么s为空,朋友你知道吗?
问题得到了解决:
主函数改成
int main(){
Person *p = new Student("zhang",22,"091150");
Student *s=dynamic_cast<Student*>(p);
if(s==0){
cout<<"NULL POINTER"<<endl;
}else{
cout<<"IT IS NOT NULL POINTER"<<endl;
s->show();
}
system("pause");
return 0;
Student *s=dynamic_cast<Student*>(p);
if(s==0){
cout<<"NULL POINTER"<<endl;
}else{
cout<<"IT IS NOT NULL POINTER"<<endl;
s->show();
}
system("pause");
return 0;
}
- dynamic_cast<type>()转型与typeid()的使用
- C++的RTTI(dynamic_cast与typeid)
- dynamic_cast,static_cast与typeid
- RTTI(dynamic_cast与typeid)
- typeid 与 dynamic_cast
- dynamic_cast与typeid关键字
- typeid 与 dynamic_cast(C++学习)
- typeid 与 dynamic_cast(C++学习)
- typeid 与 dynamic_cast(C++学习)
- 动态运行时类型识别与显示转换(typeid(a);static_cast<type>(expression);dynamic_cast<type>(expression);const_cast<typ
- dynamic_cast typeid
- 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
- 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
- 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
- C++ typeid 与RTTI(Runtime Type Information)
- RTTI, dynamic_cast, typeid
- typeid()和dynamic_cast<>()
- RTTI(typeid、dynamic_cast)
- Eclipse中配置使用Heritrix-1.14.4
- android中dip、px相互换算
- ZEM总结
- MySQL性能优化的21个最佳实践
- 《Red5 用户参考手册》之六:入门第五章 构建 Red5
- dynamic_cast<type>()转型与typeid()的使用
- 多Pass渲染体系与多线程渲染的矛盾
- 一位软件工程师的6年总结
- 关于如何选好游戏3D引擎编程的一些经验
- 东软2012校园招聘笔试试题(B)
- 【编译原理】正则表达式
- 调用操作系统命令
- DX11与多线程渲染
- SilverLight:”无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本”的解决方案。