指向派生类对象的基类指针与虚函数
看如下代码:
CSales aSales("崔贤");
CSales* pSales;
CWage* pWager;
pSales=&aSales;
pWager=&aSales;//用基类指针指向派生类对象
pWager->setSales(800.0);//出错,因为CWage没有定义setSales
pSales->setSales(800.0);//正确,因为CSales定义了setSales
pWager->comutePay();//调用CWage的comutePay()
pSales->comutePay();//调用CSales的comutePay()
我们得出结论:指向派生类对象的基类指针只能调用基类中定义的函数。我们不能否认的是,pWager指向的是其派生类CSales对象;但是pWager却不能能调用CSales的成员函数;所以我们只能这样理解:对于指向派生类对象的基类指针,派生类的成员函数被屏蔽掉了。
下面提出一个需求:遍历链表中的每一个元素显示职员的名字并且计算工资。代码如下:
int count=0;
CEmployee* pEmp;
.......
while(pEmp=anInter.getNext())
{
count++;
cout<<count<<' '<<pEmp->getName()<<endl;//正确
cout<<"工资"<<‘ '<<pEmp->comutePay()<<endl;//出错
}
打印职员名字没有错误,虽然pEmp是基类指针,当指向派生类时,调用的getName()从基类继承下来的,在此,我要强调pEmp是指向派生类的,所以getName()返回的必然是派生类对象的名字。但是打印工资时出错,因为每个派生类都有自己的comutePay(),pEmp只能调用基类的comutePay(),而基类没有这个函数,必然会出错。虚函数在此应运而生!
在基类中声明一个纯虚函数:virtual float comutePay()=0; 问题迎刃而解!
至于虚函数的性质,想必任何一本C++书上都会讲的很清楚,我在此就不啰嗦了。我以此篇文章来说明我对于两个东西的理解:虚基类和指向派生类对象的基类指针。在此借鉴了侯捷《深入浅出MFC》上的示例,没办法,侯捷举的例子太恰当了,以至于我忍不住要拿来用一下,向侯Sir致敬!
指向派生类对象的基类指针与虚函数相关推荐
- C++派生类对象和基类对象赋值
在C++中,我们允许 将派生类对象赋给基类对象.(不允许将基类对象赋给派生类对象) 只会将基类对象成员赋值 用基类指针指向派生类对象.(不允许用派生类指针指向基类对象) 基类指针只能操作基类中的成员 ...
- C++将派生类赋值给基类(向上转型)(一)
在 C/C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值:反过来,float 类型的数据在 ...
- 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...
- 避免在派生类中重新定义基类的非虚函数
我们都知道,在基类中定义虚函数的目的是允许派生类拥有相同接口却可以有不同的实现,通过对象的指针或引用来访问虚函数可以实现运行时的多态.这么说来,在派生类中重定义(override)虚函数是没有任何问题 ...
- 在c++中,如果派生类没有重写基类中对应virtual函数会怎样?
在c++中,如果一个派生类没有重写基类中对应的虚函数,那么在派生类的构造函数中依然会创建虚指针,但是该虚指针指向的是基类的虚表. #include <iostream> #include ...
- 先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再
先建立一个Point(点)类,包含数据成员x,y(坐标点).以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再 ...
- iOS class深入理解: 实例对象、类对象、元类和isa指针
你要知道的class都在这里 转载请注明出处http://blog.csdn.net/u014205968/ 深入代码理解instance.class object.metaclass 面向对象编程中 ...
- PetShop 4.0知识点:base 关键字用于从派生类中访问基类的成员
//base 关键字用于从派生类中访问基类的成员: //调用基类上已被其他方法重写的方法. //指定创建派生类实例时应调用的基类构造函数. //基类访问只能在构造函数.实例方法或实例属性访问器中进行. ...
- [建立基类Building,作为楼房类,这个基类中包含楼房层数、房间数、楼房总面积等。再建立派生类Home_Arch、Office_Building和Hospital,分别作为住宅楼类、办公楼类和医院
[建立基类Building,作为楼房类,这个基类中包含楼房层数.房间数.楼房总面积等.再建立派生类Home_Arch.Office_Building和Hospital,分别作为住宅楼类.办公楼类和医院 ...
最新文章
- 链接3: SQL语句教程
- 微信小程序获取页面栈
- Chrome Extension 检查视图(无效)处理方法
- 小米五android o卡吗,【图片】小米5优化教程,吃鸡卡的进来!!!_小米5吧_百度贴吧...
- matlab程序崩溃怎么解决,跪求matlab达人帮我看看程序,我实在是要崩溃了......
- 如何开发一个学生成绩管理糸统(9)
- 神奇的折纸艺术!无限翻转完全停不下来
- 工作335:uni-增加表单验证
- Lesson 3 Part 2 logistic regression
- 逻辑分析题汇总(一)
- 1.中小型企业通用自动化运维架构 -- 自动化运维流程
- MSN Messenger协议
- 2018中级职称计算机题库,2018年中级通信工程师传输与接入考试试题
- 三年开发转行测试没人要
- 青龙面板+nolan-依赖+拉库+企业微信推送(手把手喂饭,各版本通用)
- MySQL程序员面试笔试宝典pdf_数据库程序员面试笔试宝典
- C语言正弦和余弦的值
- Tiny4412 LCD驱动(DRM+设备树)
- 移动端自动轮播可滑动轮播图
- 你肯定想学习的顶级Python项目(附代码)
热门文章
- 数据库作业6:SQL练习3 - SELECT
- web自动化元素定位
- 用猿大师办公助手在Chrome网页中打开了Office Word,再用桌面Office打开其他Word打不开怎么办?
- php pjax案例,jQuery pjax简单示例汇总
- excel数据透视表_来自多个工作表的Excel数据透视表更新
- highchart图表 | 改变图表颜色
- java计算机毕业设计某山区环境保护监督管理平台源码+数据库+系统+lw文档+mybatis+运行部署
- 云渲染是什么?云渲染对于物理渲染有什么好处?
- Python学习日记(三十四) Mysql数据库篇 二
- Learn a New Language