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;
}