dynamic_cast()转型与typeid()的运用
按照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;
}
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;