多态+菱形虚拟继承(下)

来源:互联网 发布:js数组和对象 编辑:程序博客网 时间:2024/06/11 03:52

对象的类型:

这里写图片描述

在这里先来看一下在继承体系中搞的人晕头转向的几个术语:

这里写图片描述

下面让我们一起进入多态的世界

多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形。

我们把具有继承关系的多个类型称为多态类型。
引用或指针的静态类型与动态类型不同这一事实正是c++语言支持多态性的根本所在。

1、多态分为静态多态和动态多态。

静态多态和动态多态还有下面的两种名字,其实意思都一样,但是为了以防我们以后见到这样的名字而不知所措,还是可以了解一下哒(笑脸):
(静态决议和动态决议)
(静态联编和动态联编)

这里写图片描述

静态多态:
编译器在编译期间完成,编译器根据实参的类型(可能会发生隐式类型转化),可推断出要调用哪个函数,如果没有对应的函数,则会出现编译错误。
动态多态:
在程序执行期间判断所引用对象的实际类型,根据实际类型调用相应的函数。

动态多态的绑定:
①基类中必须要有虚函数—->在派生类中必须重写基类中的虚函数;
②必须使用基类的指针或引用去指向派生类的对象。

小结:通过基类的指针或引用调用虚函数时,调用基类还是派生类的虚函数,要在运行时根据指针(引用)指向(引用)的类型确定,当调用非虚函数时,无论指向的是哪种类型,一定调用的是基类的函数。

当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用,也只有在这种情况下对象的动态类型才有可能与静态类型不同。

示例1:

class Base{public :     Base()          :_b(3)     {          cout << "Base()" << endl;     }     void Show()     {          cout << _b << endl;     }private :     int _b;};class Derived :public Base{public :     Derived()          :_d(4)     {          cout << "Derived()" << endl;     }     void Show()     {          cout << _d << endl;     }private :     int _d;};void Print(Base* p){     p->Show();}void Test(){     Base b;//3     Derived d;//4     Print(&b);     Print(&d);}int main(){     Test();     return 0;}

最终的结果都是3,与我们想要得到的答案不符。这是因为Show函数不是虚函数。从而验证了动态绑定的条件。

这里写图片描述

2.在派生类中进行重写(覆盖)的虚函数必须满足函数原型相同(参数列表,函数名,返回值类型(协变除外))。
补充下协变的概念:
协变:基类中的虚函数返回值类型为基类类型的指针或引用,并且派生类中重写的虚函数返回值类型为派生类类型的指针或引用。

示例如下:

class Base{public :     Base()          :_b(3)     {          cout << "Base()" << endl;     }     virtual Base* Show()//返回值类型为Base*     {          cout << _b << endl;          return this;     }private :     int _b;};class Derived :public Base{public :     Derived()          :_d(4)     {          cout << "Derived()" << endl;     }     virtual Derived* Show()//返回值的类型为Derived*     {          cout << _d << endl;          return this;     }private :     int _d;};void Print(Base* p){     p->Show();}void Test(){     Base b;//3     Derived d;//4     Print(&b);     Print(&d);}

结果如下:

这里写图片描述

3.虚函数注意要点:

①不要在构造函数和析构函数内部调用虚函%

0 0
原创粉丝点击