重载与多态
一、教学目标
熟练了解并掌握重载和多态的相关概念,进而在平时应用到,并且能了解其中的思想和过程
二、教学过程
(一)定义
多态是指同样的消息被不同类型的对象接收时导致的不同的行为,消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。。
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)抽象类
带有纯虚函数的类是抽象类。抽象类的主要作用是通过它为一个类族建立一个公共的接口, 使它们能够更有效地发挥多态特性。
抽象类声明了一组派生类共同操作接口的通用语义,而 接口的完整实现,即纯虚函数的函数体,要由派生类自己给出。
但抽象类的派生类并非一定 要给出纯虚函数的实现,如果派生类没有给出纯虚函数的实现,这个派生类仍然是一个抽象 类。
三、总结与反思
函数的多态,重载,抽象类本质上都提高了实现功能时,代码的效率,要学会这种思想。
更加高效的实现功能