凡科客服/seo网站优化软件
按照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;
}