C++ 第五次作业 重载与多态

安稳与你 提交于 2019-12-02 11:44:25

 重载与多态

 

一、教学目标

熟练了解并掌握重载和多态的相关概念,进而在平时应用到,并且能了解其中的思想和过程

 

二、教学过程

(一)定义

多态是指同样的消息被不同类型的对象接收时导致的不同的行为,消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。。

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)抽象类

带有纯虚函数的类是抽象类。抽象类的主要作用是通过它为一个类族建立一个公共的接口, 使它们能够更有效地发挥多态特性。

抽象类声明了一组派生类共同操作接口的通用语义,而 接口的完整实现,即纯虚函数的函数体,要由派生类自己给出。

但抽象类的派生类并非一定 要给出纯虚函数的实现,如果派生类没有给出纯虚函数的实现,这个派生类仍然是一个抽象 类

三、总结与反思

函数的多态,重载,抽象类本质上都提高了实现功能时,代码的效率,要学会这种思想。

更加高效的实现功能

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!