`
java-mans
  • 浏览: 11436038 次
文章分类
社区版块
存档分类
最新评论

dynamic_cast<type>()转型与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;
}

欢迎回帖,第一个代码问题出在哪里,为什么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;
}

分享到:
评论

相关推荐

    明博静态新闻系统MinbelNews2.0

    TypeID=1&gt;文章1&lt;/a&gt;&lt;br&gt;&lt;br&gt;把新闻显示在主页或其它页面上&lt;br&gt;&lt;script type="text/javascript" src="/Files/ShowFileItems.aspx?Num=8&TypeID=1&ShowTime=YES"&gt;&lt;/script&gt; &lt;br&gt;Num=数字 你要显示的信息条数&lt;br&gt;TypeID...

    Thinking_in_C++_中文版【高清+可搜索+可编辑/复制/粘贴+无密码】

    triangle* 七p = dynamic_cast&lt;triangle*&gt;(sh); 它自增。如果可以控制类的源代码并可以修改它,当然可以这样做。下面这个例子用来计算 s h a p e的个数,它用了静态数据成员和动态映射两种方法: 384 C + +编程思想 ...

    教师档案管理系统源代码

    &lt;td width="202" height="84"&gt;&lt;a href="&lt;%=rswebsite("web_firstpage")%&gt;"&gt;&lt;img src="&lt;%=rswebsite("web_logo")%&gt;" alt="logo" name="logo" width="200" height="60" border="0" id="logo" /&gt;&lt;/a&gt;&lt;/td&gt; &lt;td width=...

    小型的图书管理

    连接数据库,对实体的操作 &lt;form action="${... &lt;option value="${type.typeid}"&gt; ${type.typename} &lt;/option&gt; &lt;/c:forEach&gt; &lt;/select&gt; &lt;p&gt;&lt;input type="submit" value="提交" /&gt; &lt;/form&gt;

    jsp音乐网源码

    &lt;td&gt;&lt;input name="specialName" type="text" id="specialName" size="30" title="专辑名"&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align="center"&gt;歌曲文件:&lt;/td&gt; &lt;td&gt;&lt;input name="fileURL" type="text" id="fileURL" size="30...

    C++程序设计 刘振安 2008年版自考课本课后习题参考答案及其程序

    第一章 一、选择题 1.B; (typedef ,typeid ,... cout&lt;&lt;"字符输出:"&lt;&lt;(int)a&lt;&lt;","&lt;&lt;(int)b&lt;&lt; endl; cout&lt;&lt;"ASCII码输出:"&lt;&lt;(char)ascii_2&lt;&lt;(char)ascii_1&lt;&lt;","; cout&lt;&lt;(char)ascii_1&lt;&lt;(char)ascii_1&lt;&lt; endl; }

    网页动态菜单

    1.这个数形菜单基于java+bean+tomcat+sql2000写的&lt;br&gt;2.ConnDB.properties是数据库配置文件,可参照ConnDB.java进行修改。&lt;br&gt;3.ChStr.java处理字符。&lt;br&gt;4.把teee1.jsp放在tomcat--》webapps下配置一下就好了。&lt;br&gt;...

    dwr验证框架多级联下拉菜单

    &lt;option value="&lt;%=rs_city.getInt("ID")%&gt;" &lt;%if(rs_city.getInt("ID")==SelectID_C){%&gt;selected&lt;%}%&gt;&gt;&lt;%=rs_city.getString("Name")%&gt; &lt;/option&gt; &lt;% } while (rs_city.next()); %&gt; &lt;/select&gt; &lt;/div&gt; &lt;%} ...

    C++运行时获取类型信息的type_info类与bad_typeid异常

    必须包含 &lt;typeinfo&gt; 标头文件才能使用 type_info 类。 type_info 类的接口是: class type_info { public: virtual ~type_info(); size_t hash_code() const _CRTIMP_PURE bool operator==(con

    C++关键字详细使用

    asm auto bad_cast bad_typeid bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum except explicit extern false finally float for friend goto if ...

    PHP jqGrid 数据网格显示并分页

    &lt;script src="js/jquery-ui-1.8.2.custom.min.js" type="text/javascript"&gt; &lt;/script&gt; &lt;script src="js/jquery.layout.js" type="text/javascript"&gt;&lt;/script&gt; &lt;script src="js/i18n/grid.locale-en.js" type="text/...

    C++关键字大全(67个).txt

    dynamic_cast else enum except explicit extern false finally float for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short ...

    C++begin和end运算符的返回迭代器的类型如何判断?

    #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int main() { vector&lt;int&gt; ivec; const vector&lt;int&gt; cv; auto it1 = ivec.begin(); auto it2 = cv.begin(); cout&lt;&lt;typeid

    利用jQuery实现滑动开关按钮效果(附demo源码下载)

    &lt;div class=switchBox id=timeList typeId=time&gt; &lt;table cellpadding=0 cellspacing=0&gt; &lt;tr&gt; &lt;td class=switch_box_l&gt;&lt;/td&gt; &lt;td class=switch_box_c&gt; &lt;span class=abs&gt; &lt;i class=switchBtn-l&gt;&lt;/

    图库新版jQuery焦点图 JS代码

    document.write('&lt;script type="text/javascript" &gt;BAIDU_CLB_SLOT_ID = "288992";&lt;/script&gt;'); document.write(ojs);} if (code=="top210x90_2"){ document.write('&lt;script type="text/javascript" &gt;BAIDU_CLB_SLOT...

    鲜花网站asp

    /// &lt;param name="TypeID"&gt;类别编号&lt;/param&gt; /// &lt;param name="lblTypeName"&gt;显示类别名称的标签ID&lt;/param&gt; private void Bind(Repeater rep,string TypeID,Label lblTypeName) { string sqlString = "select ...

    select隐藏选中值对应的id,显示其它id的简单实现方法

    &lt;option value=-1&gt;-请选择类型-&lt;/option&gt; &lt;option value=grade&gt;兑换等级&lt;/option&gt; &lt;option value=money&gt;兑换现金&lt;/option&gt; &lt;option value=gift&gt;兑换礼物&lt;/option&gt; &lt;/select&gt; &lt;tr id=grade&gt;&lt;/tr&gt; &lt;tr id=money&gt;...

    C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 易懂

    &lt;procedure name&gt; [(&lt;parameter list&gt;)] IS|AS &lt;local variable declaration&gt; BEGIN &lt;executable statements&gt; [EXCEPTION &lt;exception handlers&gt;] END; */ create or replace procedure proc_getproductNambyId...

    php图书管理系统源代码

    &lt;td valign="top" bgcolor="#FFFFFF"&gt;&lt;table width="100%" height="509" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="tableBorder_gray"&gt; &lt;tr&gt; &lt;td align="left" ...

Global site tag (gtag.js) - Google Analytics