准备知识

C++中多态(polymorphism)有下面三个前提条件:

  • 必须存在一个继承体系结构.
  • 继承体系结构中的一些类必须具有同名的virtual成员函数(virtualkeyword)
  • 至少有一个基类类型的指针或基类类型的引用.这个指针或引用可用来对virtual成员函数进行调用.

程序清单:C++中多态(运时行期绑定)

#include <iostream>
using namespace std; class CTradesPerson{ // base class
public :
virtual void sayHi(){ cout<<"Just hi."<<endl;}
}; class CTinker : public CTradesPerson{// drived class 1
public :
virtual void sayHi(){cout<<"Hi, I tinker."<<endl;}
}; class CTailor : public CTradesPerson{// drived class 2
public:
virtual void sayHi(){ cout<<"Hi, i tailor"<<endl;}
}; int main(){
CTradesPerson* p; // pointer to base class
int which ; // prompt user for a number
//*** 1 ==CTadesPerson
// 2 ==CTinker
// 3 ==CTailor
do{
cout <<"1 == CTradesPerson, 2 == CTinker, 3 == CTailor"<<endl;
cin >>which;
}while(which<1||which>3); //set pointer p depending on user choice
switch(which){
case 1: p = new CTradesPerson; break;
case 2: p = new CTinker; break;
case 3: p = new CTailor; break;
}
// invoke the sayHi method via the pointer
p->sayHi(); // ***runt-time binding in effect
delete p; // *** free the dymanicall y allocated storage
return 0;
}

程序清单说明

程序清单的程序阐明了多态及其三个前提条件:

  • 存在一个继承体系结构,CTradesPerson是基类,CTinker和CTailor是CTradesPerson的派生类.
  • 继承体系结构中有一个叫sayHi的虚成员函数,它在上述三个类中各自被定义一次,因此共同拥有三个不同的定义(但函数名同样).
  • p是个基类类型的指针.在本程序清单中p的数据类型是CTradesPerson*. 指针p用来实施对虚成员函数sayHi的调用.

測试数据

在该程序的某次执行过程中,我们输入数据1,就会得到例如以下结果:

当我们输入数据3, 就会得到例如以下结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ3ppdGVh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

关于Program Language很多其它讨论与交流。敬请关注本博客和新浪微博songzi_tea.

程序基石系列之C++多态的前提条件的更多相关文章

  1. 黑马程序员——JAVA基础之多态与Object

    ------- android培训.java培训.期待与您交流! ----------  多态 : 多态定义:  某一类事物的多种存在形态. 多态的体现: 父类的引用指向了自己的子类对象.       ...

  2. 黑马程序员_Java面向对象3_多态

    5.面向对象_多态 多态定义:某一种事物存在的多种形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型. 猫 x = new 猫(); 同时猫也是动物的一种,也可以把猫称为动物. 动物 y = n ...

  3. 漫谈程序员系列:3D打印能打印出程序员吗

    首先声明,本文是一本正经的胡扯,绝不是随随便便的胡扯,请您不要随便攻击我胡说八道.我要反复星爷在<喜剧之王>里的台词:事实上.我是一本正经的喷子. 3D打印的定义 关于3D打印,以下是来自 ...

  4. 【微信小程序开发•系列文章六】生命周期和路由

    这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...

  5. ASP.NET4.5Web API及非同步程序开发系列3

    ASP.NET4.5Web API及非同步程序开发系列(3) 接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象. 请求相关问题的补充: 我们先在Controller中的定 ...

  6. ASP.NET4.5Web API及非同步程序开发系列

    ASP.NET4.5Web API及非同步程序开发系列 认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP ...

  7. 微信小程序之微信登陆 —— 微信小程序教程系列(20)

    简介: 微信登陆,在新建一个微信小程序Hello World项目的时候,就可以看到项目中出现了我们的微信头像,其实这个Hello World项目,就有一个简化版的微信登陆.只不过是,还没有写入到咱们自 ...

  8. Windbg程序调试系列5-高CPU问题分析

    上篇博客中给大家分享了使用Windbg进行Live Debugging: Windbg程序调试系列4-Live Debugging 本篇中我们继续,跟大家分享常见的应用程序高CPU使用率问题分析. 先 ...

  9. Windbg程序调试系列4-Live Debugging

    上篇博文中给大家分享了使用Windbg分析线程阻塞问题: Windbg程序调试系列3-线程阻塞问题 本篇中我们继续,跟大家分享附加进程实时调试-Live Debugging. 先说一下使用Windbg ...

随机推荐

  1. ACE的饼图显示保留两位小数

    修改源js文件:jquery.flot.pie.min.js <script src="/static/assets/js/jquery.flot.pie.min.js"&g ...

  2. 【NOIP2016练习】T3 subset (分块,状压DP)

    3 subset 3.1 题目  述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 add s 在集合中加入数字 s. del s 在集合中删除数字 s.保证 s 存在 cnt s 查 ...

  3. 12深入理解C指针之---指针多层间接引用

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 一.指针多层引用 1.定义:指针可以用不同的间接引用层级,通常使用多重指针或字符数组来 ...

  4. 最全py2exe

    这次不是直接讲解下去,而是谈一下如何把我们写的游戏做成一个exe文件,这样一来,用户不需要安装python就可以玩了.扫清了游戏发布一大障碍啊! perl,python,java等编程语言,非常好用, ...

  5. Scrapy学习-12-使用DownloaderMiddleware随机修改User-Agent

    随机替换请求头中的User-Agent 基于github开源项目,实现User-Agent的动态切换和管理 https://github.com/hellysmile/fake-useragent   ...

  6. 使用vue-cli搭建element-ui项目

    最近在使用element-ui搭建项目时发现若只纯用webpack来运行element-ui,要配置各种文件,对于新手来说实在太不友好了, 就想到用vue-cli来搭建整个vue项目 1.安装node ...

  7. 专访Nick McKeown:网络领域的游戏颠覆者

    如果要找到一个过去10年在网络领域最热的词汇,那么非SDN(软件定义网络)莫属.在过去的十年间无论是学术机构还是标准组织,无论是电信巨擘还是互联网大厂都成其拥趸. 然而几乎每一件SDN的重大事件都离不 ...

  8. JavaScript世界万物诞生记

    作者:manxisuo链接:https://zhuanlan.zhihu.com/p/22989691来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一. 无中生有 起 ...

  9. ARM 浮点运算

    转载: http://www.embedu.org/Column/Column821.htm http://blog.sina.com.cn/s/blog_602f87700100r5xe.html ...

  10. 在C#的数据类型中,什么属于值类型,什么属于引用类型

    转自原文 在C#的数据类型中,什么属于值类型,什么属于引用类型 类型:整数,浮点数,高精度浮点数,布尔,字符,结构,枚举引用类型:对象(Object),字符串,类,接口,委托,数组除了值类型和引用类型 ...