【c++笔记十二】面向对象三大特征之《多态》

晴 周四

虽然今天天气很好但是长沙重度污染还是呆在机房写笔记好了。昨天写了面向对象的三大特征的前两个——封装和继承。只有你好好理解了继承,我们才好开始今天的【多态】的讲解(如果不懂得请看我的【c++笔记十一】)。

——————————————分割线————————————————

一.虚函数

在开始讲多态之前还得给大家补充两个知识点,第一个就是弄懂虚函数。

还记得我们昨天讲继承的最后一个知识点“多继承”时提到了,用虚继承解决成员数据访问。我们第一次看到了“virtual”关键字。其实虚函数你听名字就知道这是什么了:

大家一定要注意:这个成员函数必须是非静态的(没有

看程序就懂了:

#include <iostream>using namespace std;class A{public:virtual void show(){cout<<"virtual void show()"<<endl;}};int main(){A a;a.show();return 0;}

大家先不必关注虚函数的作用是什么,只要记住虚函数是什么就行了。从本文的后面你就懂虚函数是多态的关键。

二.函数重写

这是我们要给大家补充的第二个知识点。

1.什么是函数重写?

在子类中提供一个和父类同名的虚函数,要求返回值、函数名、参数列表都必须相同,这叫做函数重写。

2.函数重载、名字隐藏和函数重写的区别:

如果大家仔细看函数重写的概念,你会发现它和名字隐藏(不懂请看

(的函数构成重载关系。

(叫做名字隐藏。

(叫做函数重写。

函数重写和函数重载的区别在于:函数重载的两个函数要在同一个作用域中并且参数列表不同。但是函数重写的函数必须参数列表也要一模一样,而且是在子类和父类之间的。

函数重写和名字隐藏的区别在于:名字隐藏的所有父类成员数据,而函数重写的必须是父类中的虚函数。

大家认真看完这两个知识点之后,我们可以开始我们【多态】的讲解了。

三.多态1.什么是多态?

当父类型的指针(引用),指向(引用)子类对象时,如果调用父类中的虚函数并且子类重写了这个虚函数,则调用的函数实现是子类的函数实现。

a.继承是构成多态的基础。

b.虚函数是构成多态的关键。

c.函数重写是多态的必备条件。

可能当你现在还不是很懂多态的概念,没关系,我们通过不断地举例来解释第一段话。

#include <iostream>using namespace std;class A{public:virtual void show(){cout<<"A::show()"<<endl;}};class B:public A{public:void show(){cout<<"B::show()"<<endl;}};int main(){A a;a.show();B b;A* a1 = &b;A& a2 = b;a1->show();a2.show();return 0;}

A了

我们创建了a1

我们还创建了a2

这就是多态的表现,所以掌握多态一定要弄懂“继承、虚函数、函数重写”。你可以开始慢慢体会为什么要叫做“引用”。父类可能有很多子类的,但是我们只需要通过调用父类的这个虚函数,就能让这个成员有各种各样的实现方式,呈现出一种函数调用的“多样性”。

你以为我们多态讲完了?不,这还只是开始。

2.多态的使用

在弄懂什么是多态之后,我们要开始学会运用多态。

多态的好处就是:类型通用(只需要使用父类)和便于扩展功能(扩展的功能交给子类去实现)。

多态的使用一般是将父类型作为函数参数或者函数返回值。

我们一起来看看我们怎么用多态吧:

#include <iostream>using namespace std;class XiaoMi{public:virtual void show(){}};class M4:public XiaoMi{public:void show(){cout<<"小米4:1999元,现货供应"<<endl;}};class Note:public XiaoMi{public:void show(){cout<<"小米note:2299元,每周二中午12点抢"<<endl;}};void Buy(XiaoMi& mi){mi.show();} XiaoMi* Test(string name){if("小米4" == name)return new M4();else if("小米note" == name)return new Note();elsereturn NULL;}int main(){M4 m4;Note note;Buy(m4);Buy(note);Test("小米4")->show();Test("小米note")->show();return 0;}

仔细看上面的代码。

全局函数

全局函数

3.多态的实现

个人觉得只有彻底理解多态是怎么实现的,才算真正的掌握了多态。

多态实现是一种:动态绑定。

呼唤你前往另一个地方,过上另一种生活。

【c++笔记十二】面向对象三大特征之《多态》

相关文章:

你感兴趣的文章:

标签云: