通过对象类型区分来实现多态
来源:互联网 发布:阿里云ecs搭建ss 编辑:程序博客网 时间:2024/05/17 16:54
一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态。
下面的例子中,通过对象类型不同来区分不同的类,实现多态。
要求类层次中的父类有一个反映类型的数据成员,而且该成员要能够被使用者所访问(要求是public)。
//-----------student.h--------------#ifndef STUDENT__H#define STUDENT__H#include <iostream>class Student{private:std::string name;int semesterHours;double average;public:enum StudentType{STUDENT,GRADUATESTUDENT}; //定义反应类型的的数据成员,通过这里来区分 是Student的对象还是GraduateStudent的对象StudentType type;Student(std::string pN = "noName"){type = STUDENT; //Student对象的标志name = pN;semesterHours = 0;average = 0;}void calcTuition(){std::cout<<"Student tuition calculation."<<std::endl;}};#endif
//----------graduatestudent.h----------#ifndef GRADUATESTUDENT__H#define GRADUATESTUDENT__H#include "student.h"class Advisor{private:int noOfMeeting;};class GraduateStudent : public Student //继承 Student{private:Advisor advisor;int qualifierGrade;public:GraduateStudent(std::string pN = "noName"){type = GRADUATESTUDENT; //GraduateStudent 对象的标志qualifierGrade = 0;Student::Student(pN); //父类重载 传递 name}void calcTuition(){std::cout<<"GraduateStudent Tuition calculation."<<std::endl;}};#endif
//---------main.cpp------------#include "student.h"#include "graduatestudent.h"using namespace std;void fn(Student &s){switch(s.type){case Student::STUDENT: //通过构造函数中的type来区分对象的类型s.calcTuition();break;case GraduateStudent::GRADUATESTUDENT: //通过构造函数中的type来区分对象的类型GraduateStudent &ss = static_cast<GraduateStudent &>(s); //这个地方用的 “很妙”ss.calcTuition();//(static_cast<GraduateStudent>s).calcTuition(); //错//GraduateStudent(s).calcTuition(); //错break;}}int main(int argc,char **argv){Student ds("Lo lee undergrade");GraduateStudent gs("Jack");fn(ds); //通过对象类型做出不同反应fn(gs); //通过对象类型做出不同反应return 0;}
Student tuition calculation.
GraduateStudent Tuition calculation.
请按任意键继续. . .
在父类中设置type成员(student.h中)是为了让所有的子类都能共享。
通过这样的手段,我们终于可以让函数fn()实现多态了,也就是fn()函数代码可以通过对象的公有数据数据成员辨认其类的层次信息,从而选择决定调用哪个成员函数。
1
0 0
- 通过对象类型区分来实现多态
- 通过XMLHTTP对象来实现文件下载
- 通过Graphics对象来实现动画效果
- 通过Graphics对象来实现动画效果
- 通过 虚函数 来实现多态
- 【干货】C++通过模板特化实现类型萃取实例--实现区分基本类型与自定义类型的memcpy
- 设计模式必须通过面向对象来实现吗?
- Object.prototype.toString.call() 区分对象类型
- Object.prototype.toString.call() 区分对象类型
- Object.prototype.toString.call() 区分对象类型
- Object.prototype.toString.call() 区分对象类型
- 通过ResourceBundle读取配置文件来实现多态的数据库连接
- 通过RFC创建某种类型的物料的会计视图-----通过MMZ1来实现
- 不区分不行的弱类型脚本中的有类型对象-iFrame通过document.getElementById方法访问和document.nameIframe的差异
- 为何不能通过返回值来区分重载方法
- iOS 给图片加标识符,通过标识符来区分图片
- 为什么不能通过返回值类型区分重载?
- 类型区分
- 挂起终端 http://www.educity.cn/linux/1590402.html
- android导航栏没有固定,输入法弹出,就会顶上去
- HDU 2546 饭卡(01背包问题)
- C++学习(一)- 虚函数和重载函数的区别(3)
- lintCode 删除元素
- 通过对象类型区分来实现多态
- UVa694 - The Collatz Sequence:Time limit exceeded
- 第四周项目(4):建设双链表算法库
- AI设计---Robot(v1.0),简单对话的实现
- 查询在2月份入职的所有员工信息
- uvalive 3485 - 数值积分
- HDU 2547 无剑无我(水~)
- 产生一个螺旋矩阵
- 系统程序员成长计划读后感