当在C++的基类与派生类之间转换时,其多态性充分显现出来;

本次只讨论  dynamic_cast  的用法。

在查阅资料后发现百度百科关于  dynamic_cast  (以及static_cast) 的代码说得十分清楚,摘抄如下(正所谓英雄不问出处):

#include"stdafx.h"
#include<iostream>
#include<stdlib.h>
using namespace std;
class Base
{
public:
virtual void f(){cout<<"Base::f"<<endl;}
void f1(){cout<<"Base::f1"<<endl;}
private:
double x;
double y;
};
class Derived:public Base
{
public:
virtual void f(){cout<<"Derived::f"<<endl;}
virtual void k(){cout<<"Derived::k"<<endl;}
private:
double z;
};
class Base1
{
public:
virtual void g(){cout<<"Base1::g"<<endl;}
void g1(){cout<<"Base1::g1"<<endl;}
};
class Derived1:public Base,public Base1
{
public:
virtual void f(){cout<<"Derived1::f"<<endl;}
virtual void h(){cout<<"Derived1::h"<<endl;}
};
void Test1()
{
//对于单继承,
//如果pD真的指向Derived,用dynamic_cast和static_cast效果相同
cout<<"-----------------Test1-----------------"<<endl;
Base* pD=new Derived;
Derived* pD1=dynamic_cast<Derived*>(pD);
pD1->f();
pD1->k();
pD1->f1();
Derived* pD2=static_cast<Derived*>(pD);
pD2->f();
pD2->k();
pD2->f1(); //但是如果pB不是真的指向Derived,则用dynamic_cast则返回NULL,能够更早的禁止error的发生,
//如果用static_cast虽然返回的不为NULL,但是运行时可能抛出exception。
/**/////Errorcode
//Base*pB=new Base();
//Derived*pD3=static_cast<Derived*>(pB);
//pD3->f();
//pD3->k();
//pD3->f1();
//Derived*pD4=dynamic_cast<Derived*>(pB);
//pD4->f();
//pD4->k();
//pD4->f1();
}
void Test2()
{
//对于多重继承,
//如果pD真的指向的是Derived1,使用dynamic_cast和static_cast都可以转化为Derived1,
//但是如果要转化为Base的兄弟类Base1,必须使用dynamic_cast,使用static_cast不能编译。
cout<<"-----------------Test2-----------------"<<endl;
Base* pD=new Derived1;
Derived1* pD1=dynamic_cast<Derived1*>(pD);
pD1->f();
pD1->h();
pD1->f1();
Base1* pB1=dynamic_cast<Base1*>(pD);
pB1->g();
Derived1* pD2=static_cast<Derived1*>(pD);
pD2->f();
pD1->h();
pD2->f1();
/**/////errorcannotcompiler
//Base1*pB2=static_cast<Base1*>(pD);
//pB2->g();
//当然对于pB不是真的指向Derived1,想要转化为Derived1或Base的兄弟类Base1,情况与Test1中的error情况相同。
} void Test3()
{
cout<<"-----------------Test3-----------------"<<endl;
Derived1* pD1=new Derived1;
Base1* pB1= pD1; //此时pB1可以访问g(),g1()
Base* pB = dynamic_cast<Base*>(pB1); //兄弟类之间的转换
pB->f(); //Base类f()被覆盖,访问的是Derive1类的f(),这一点有点像是“基类对象访问派生类的函数”
pB->f1();
} int _tmain(int argc,_TCHAR*argv[])
{
Test1();
Test2();
Test3();
system("Pause");
return 0 ;
}

  其中Test3()所测试的功能Test2()中已有。

Test3()中基类对象指针pB在访问f()时,由于Base类f()被覆盖,所以访问的是Derive1类的f();

另外对于  static_cast  的用法,这里就不多说了,自己去查吧。

最新文章

  1. 调用WCF不需要添加服务引用,使用一个WCFHelper类就可以
  2. 一款开源免费跨浏览器的视频播放器--videojs使用介绍
  3. jQuery-1.9.1源码分析系列(十一) DOM操作
  4. 微信小程序开发工具使用与设计规范(二)
  5. 面向.Net程序员的前端优化
  6. iOS7 和 iOS6的页面兼容问题
  7. (1)建立一个名叫Cat的类: 属性:姓名、毛色、年龄 行为:显示姓名、喊叫 (2)编写主类: 创建一个对象猫,姓名为“妮妮”,毛色为“灰色”,年龄为2岁,在屏幕上输 出该对象的毛色和年龄,让该对象调用显示姓名和喊叫两个方法。
  8. CrazePony飞行器--相关资料网址
  9. 为checkboxSelectionModel赋值
  10. C99标准中的部分新特性
  11. webServices 执行流程,(我是菜鸟,我怕谁,仅代表个人理解,欢迎各位大神们指导,不和您的胃口,请默默离开!!)
  12. js 获取元素在页面上的偏移量的最佳方式
  13. 加载为应用程序池‘DefaultAppPool&#39;提供服务的进程失败,应用程序池被禁用【解决方法】
  14. (二)Lua脚本语言入门
  15. PHP合并两张图片(水印)
  16. JS全选与不选、反选
  17. wamp设置实现本机IP或者局域网访问
  18. 【读书笔记】iOS-网络-错误处理的经验法则
  19. 支持向量机通俗导论(理解SVM的三层境界)【非原创】
  20. Winform窗体传值

热门文章

  1. Query类型_JDBC的方法_JAVA方法_Loadrunner脚本
  2. Vue 项目在其他电脑 npm run dev 运行报错的解决方法
  3. 减少Java垃圾的产生,降低内存使用量
  4. ShipStation Now Uses AWS And Amazon Fulfillment To Automatically Ship From eBay, Sears And Other Marketplaces
  5. zigbee,质量追溯系统,上位机,mis系统,C#(一)
  6. 基础系列(4)—— C#装箱和拆箱
  7. nodejs 中on 和 emit
  8. LAMP 系统服务搭建过程详解
  9. jdbc 1.0
  10. 3dContactPointAnnotationTool开发日志(二七)