代码改变世界

重载和多态

2019-10-27 23:06  艾伦爱尔敏  阅读(562)  评论(0编辑  收藏  举报

1.多态的类型

  面向对象的多态性可以分为四类:重载多态、强制多态、包含多态和参数多态。前面两种统称为专用多态,后面两种称为通用多态。之前学过的普通函数及类的成员函数的重载都属于重载多态。运算符的重载也是重载多态。强制多态是指将一个变元的类型加以变化,以符合一个函数或者操作的要求,加法运算符在进行浮点数与整数相加时,首先进行类型的强制转换,把整形数强制转换为浮点型再相加的情况就是强制多态。

  包含多态是类族中定义不同成员函数的多态性为。主要是通过虚函数来实现的。参数多态与类模板相关联,在使用时必须赋予实际的类型才可以实现实例化。。这样,由类模板实例化的各个类都具有相同的操作,而操作对象的类型却各不相同。

2.多态的实现

多态从实现的角度可以分为两类:编译时的多态和运行时的多态。编译时的多态是在编译的过程中确定了同名操作的具体操作对象,而运行时的多态则是在程序运行过程中才动态的确定擦操作所针对的具体对象。这个确定操作的过程就是绑定。绑定是指计算机程序自身彼此关联的过程,就是把一条消息和一个对象的方法相结合的过程。按照绑定进行的阶段的不同,可以分为两种不用的绑定方法:静态绑定和动态绑定,其分别对应着多态的两种实现方式。

绑定在编译链接阶段完成的情况称为静态绑定。

绑定工作在程序运行阶段完成的情况称为动态绑定。

 

 

 1 #include<iostream>
 2 using namespace std;
 3 class Base1 {
 4 public:
 5     virtual void display()const;
 6 };
 7 
 8 void Base1::display()const {
 9     cout << "Base1::display()" << endl;
10 }
11 
12 class Base2 :public Base1 {
13 public:
14     void display()const;
15 };
16 
17 void Base2::display()const {
18     cout << "Base2::display()" << endl;
19 }
20 
21 class Derived :public Base2 {
22 public:
23     void display()const;
24 };
25 
26 void Derived::display() const {
27     cout << "Derived::display()" << endl;
28 }
29 
30 void fun(Base1* ptr) {
31     ptr->display();
32 }
33 int main()
34 {
35     Base1 base1;
36     Base2 base2;
37     Derived derived;
38     fun(&base1);
39     fun(&base2);
40     fun(&derived);
41     return 0;
42 }

 

 虚函数声明语法:

virtual 函数类型 函数名(形参名);

虚函数声明只能出现在类的定义中的函数原型声明中,而不能在成员函数实现的时候。