C++ 第五次作业 重载与多态
重载与多态
一、教学目标
熟练了解并掌握重载和多态的相关概念,进而在平时应用到,并且能了解其中的思想和过程
二、教学过程
(一)定义
多态是指同样的消息被不同类型的对象接收时导致的不同的行为,消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。。
C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中 主要的方式。
(二)多态的类型
面向对象的多态性可以分为4类:重载多态,强制多态,包含多态和参数多态,前面两种称为专用多态,后面两种称为通用多态。
(三)多态的实现
分为两类:编译时的多态和运行时的多态。
(四)具体应用:
1.运算符重载:
运算符重载就是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。
运算符重载的本质就是函数重载。
注:运算符重载为类型的成员函数时,函数的参数个数比原来的操作个数要少一个;(后置++;- -除外)
重载为非成员函数时,个数相同。
举例:定义计数器 Counter 类,对其重载运算符 +
typedef unsigned short USHORT;
#include <iostream.h>
class Counter
{
public:
Counter(); Counter(USHORT initialValue);
Counter(){}
USHORT GetItsVal()const
{
return itsVal;
}
void SetItsVal(USHORT x)
{itsVal = x; }
Counter operator+ (const Counter &);
private:
USHORT itsVal;
};
Counter::Counter(USHORT initialValue): itsVal(initialValue) { }
Counter::Counter(): itsVal(0) { }
Counter Counter::operator+ (const Counter & rhs)
{
return Counter(itsVal + rhs.GetItsVal());
}
int main()
{
Counter varOne(2), varTwo(4), varThree;
varThree = varOne + varTwo;
cout << "varOne: " << varOne.GetItsVal()<< endl;
cout << "varTwo: " << varTwo.GetItsVal() << endl;
cout << "varThree: " << varThree.GetItsVal() << endl;
return 0;
}
程序运行输出:
varOne: 2
varTwo: 4
varThree: 6
2.虚函数:
(1)定义:虚函数是动态绑定的基础。虚函数必须是非静态的成员函数。
虚函数声明只能出现在类定义的原型声明中,而不能出现在成员函数实现的时候
定义一个哺乳动物 Mammal 类,再由此派生出狗 Dog 类,二者都定义 Speak()成员函数, 基类中定义为虚函数,
定义一个 Dog 类的对象,调用 Speak 函数,观察运行结果。
#include <iostream.h>
class Mammal
{
public: Mammal():itsAge(1)
{
cout << "Mammal constructor...\n";
}
Mammal()
{
cout << "Mammal destructor...\n";
}
virtual void Speak() const
{
cout << "Mammal speak!\n";
}
};
class Dog : public Mammal {
public:
Dog()
{
cout << "Dog Constructor...\n";
}
Dog() {
cout << "Dog destructor...\n";
}
void Speak()const
{ cout << "Woof!\n";
}
};
int main()
{
Mammal *pDog = new Dog;
pDog->Speak();
return 0; }
程序运行输出:
Mammal constructor...
Dog constructor...
Woof! Dog destructor...
Mammal destructor...
3.纯虚函数与抽象类:
(1)纯虚函数
纯虚函数是一个在基类中声明的虚函数,它在该基类之中没有定义具体的操作内容,要求各派生类根据实际需要给出各自的定义。
纯虚函数的声明格式为:virtual 函数类型 函数名(参数表)=0;
声明为纯虚函数之后,基类中就可以不再给出函数的实现部分。纯虚函数的函数体由派生类给出
注:纯虚函数不同于函数体为空的虚函数,纯虚函数根本就没有函数体。
(2)抽象类
带有纯虚函数的类是抽象类。抽象类的主要作用是通过它为一个类族建立一个公共的接口, 使它们能够更有效地发挥多态特性。
抽象类声明了一组派生类共同操作接口的通用语义,而 接口的完整实现,即纯虚函数的函数体,要由派生类自己给出。
但抽象类的派生类并非一定 要给出纯虚函数的实现,如果派生类没有给出纯虚函数的实现,这个派生类仍然是一个抽象 类。
三、总结与反思
函数的多态,重载,抽象类本质上都提高了实现功能时,代码的效率,要学会这种思想。
更加高效的实现功能
posted on 2019-10-26 16:03 nianshaomingtu 阅读(434) 评论(0) 编辑 收藏 举报