多态与虚函数
- 多态性概念
是指同样的消息
被不同的对象接收时导致的不同行为
。消息
是指对类的成员函数的调用
;不同的行为
是指不同的实现,也就是调用不同的函数
。
- 赋值兼容性规则
- 对于基类及其公有派生类的对象,可以使用相同的函数统一处理,而没有必要为每个类设计单独的功能模块
- 当函数的形参为基类对象时,实参可以是派生类的对象
- 当函数的形参为指向基类对象的指针时,实参可以是派生类对象的地址
- 当函数的形参为基类对象的引用时,实参可以是派生类的对象
- 虚函数的使用方法
(1)在基类用virtual声明成员函数为虚函数。在派生类中重新定义同名函数,让它具有新的功能。
(2)在派生类中重新定义此函数时,要求函数名、函数类型、参数个数和类型与基类的虚函数相同,根据需要重新定义函数体C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数自动成为虚函数。
(3)定义一个指向基类对象的指针变量,并让它获得同一类族中某个对象的地址。
(4)用该指针变量调用虚函数,调用的就是该对象所属类的虚函数。
实验内容
设计评选优秀教师和优秀学生候选人的程序。如果学生的分数大于90,则可评为优秀生;如果教师发
表的论文数大于 3,则可评为优秀教师。具体要求如下:
(1)定义基类Base:①保护数据成员
char name[8]; //存放姓名
int num; //存放分数或论文数
②公有成员函数
Base():构造函数,输入姓名;
void print):功能函数,输出数据成员;
virtual int Isgood()=0:纯虚函数,用于判断是否满足条件;
(2)由基类派生学生类Student,定义公有成员函数:
Student():构造函数,输入分数;
int Isgood():根据优秀学生的标准,满足条件返回1,否则返回0;
(3)由基类派生教师类Teacher,定义公有成员函数:
Teacher():构造函数,输入论文数;
int Isgood():根据优秀教师的标准,满足条件返回1,否则返回0;
(4)在主函数中定义学生数组和教师数组,输入一系列教师或学生的记录后,将优秀教师及学生候选
人的情况列出来,并体现运行的多态性
代码展示
#include <iostream>
using namespace std;
class Base
{
protected:
char name[8]; //存放姓名
int num; //存放分数或论文数
public:
Base(); //构造函数,输入姓名
void print(); //功能函数,输出数据成员
virtual int Isgood()=0; //纯虚函数,满足条件返回1,否则返回0
};
Base::Base()
{
cout<<"姓名:";
cin>>name;
}
void Base::print()
{
cout<<"姓名:"<<name<<'\t'<<num<<'\n';
}
class Student:public Base
{
public:
Student(); //构造函数,输入分数
int Isgood(); //根据优秀学生的标准,满足条件返回1,否则返回0
};
Student::Student()
{
cout<<"考试成绩:";
cin>>num;
}
int Student::Isgood()
{
return (num>90)?1:0;
}
class Teacher:public Base
{
public:
Teacher(); //构造函数,输入论文数
int Isgood(); //根据优秀教师的标准,满足条件返回1,否则发怒hi0
};
Teacher::Teacher()
{
cout<<"论文数:";
cin>>num;
}
int Teacher::Isgood()
{
return (num>3)?1:0;
}
int main()
{
cout<<"请输入学生信息:\n";
Student stu[5];
cout<<"\n请输入教师信息:\n";
Teacher tea[5];
cout<<"\n优秀学生候选人:\n";
int i;
Base *p;
for(i=0,p=stu;i<5;i++,p++)
if(p->Isgood())
p->print();
cout<<"\n优秀教师候选人:\n";
for(i=0,p=tea;i<5;i++,p++)
if(p->Isgood())
p->print();
}