什么是多态?

(1)通过继承同一个基类,产生了相关的不同的派生类,与基类中同名的成员函数在不同的派生类中会有不同的实现,也就是说:一个接口、多种方法。

(2)多态是面向对象的重要技术之一,它是一种行为的封装,是同一个事物所表现出来的多种形态,简单地说就是:一个接口、多种形态。

(3)在运行时使用同一个成员名来调用类对象的成员函数,会调用哪个对象的成员函数呢?这就是多态要解决的问题!

多态的作用

(1)多态技术允许将基类指针或基类引用指向派生类对象。

(2)把不同派生类的对象都当作基类对象来看待,可以屏蔽不同派生类之间的差异,从而写出通用的代码以适应需求的不断变化。

多态的分类?

多态分为两种:
一种是静态多态,是指编译时候的多态,通过函数重载或者运算符重载实现。
一种是动态多态,是指运行时候的多态,通过虚函数与基类指针共同作用实现。

在C++中如何实现多态

(1)在C++中,基类指针是用来指向基类对象的,如果用它来指向派生类对象,则进行指针类型转换(上行转换),将派生类指针转换为基类指针,所以该指针将会指向派生类对象中的基类部分,通过该指针是无法调用派生类对象中的成员函数的。

但是,虚函数突破了这一限制。在派生类的基类部分中,派生类的虚函数取代了基类原来的同名虚函数,因此在使基类指针指向派生类对象后,使用该基类指针调用这个同名虚函数成员时就调用了派生类的虚函数。

(2)当把基类的某个成员函数声明为虚函数时,C++允许在其派生类中对该虚函数进行重新定义,赋予它新的功能,并且可以通过基类指针指向同一类族的不同派生类的对象,来调用相应派生类中的该同名虚函数。

由虚函数实现的动态多态性就是:同一族类中不同的派生类对象,对用一函数调用作出不同的响应.

(3)虚函数的使用方法如下:

在基类中使用virtual关键字声明成员函数为虚函数(这样就可以在派生类中对该虚函数进行重新定义,赋予它新的功能)。
在派生类中重新定义此虚函数,要求函数名、形参列表、返回值类型均要与基类中的虚函数相同,并根据具体需要重新定义它的函数体。
(4)C++规定,当一个成员函数被定义为虚函数后,其派生类中的同名函数都自动成为虚函数(而不一定要有关键字virtual显示声明了),但是为了清晰,习惯上每一层都加上virtual关键字。

举例:

include
using namespace std;

class Base {
public:
virtual void f() { cout << "Base:f()" << endl; }

	virtual void g() { cout << "Base:g()" << endl; }

	void my() { cout << "Base:my()" << endl; }

};

class Derive: public Base {
public:
virtual void f() { cout << "Derive:f()" << endl; }

	void g() { cout << "Derive:g()" << endl; }

	void my() { cout << "Derive:my()" << endl; }

};

int main() {
Base *base = new Derive;

Derive child;

base->f();    //Derive:f();
base->g();    //Derive:g();
base->my();   //Base:my();

child.f();    //Derive:f();
child.g();    //Derive:g();
child.my();   //Derive:my();

return 0;

}
运行结果

posted on 2019-10-27 19:10  neonman  阅读(107)  评论(0编辑  收藏  举报