码迷,mamicode.com
首页 > 其他好文 > 详细

9,多态

时间:2016-08-25 20:59:06      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

一、名词解释


 

  1,多态

    1)静态多态:a) 函数多态:函数重载,运算符重载

          b) 模板多态:函数模板,类模板

    2)动态多态:虚函数(切记:只有通过指针或引用才能实现动态多态性。"对象.虚函数“ 和 ”类::虚函数“ 这两种形式不能实现多态)

  2,静态类型与动态类型

    1) 静态类型:声明对象时,对象被赋予的类型,编译时期确定。

    2) 动态类型:指针或引用所指对象的类型。常常是,基类指针指向派生类对象,那么这个指针(或引用)的静态类型是基类指针或引用,其动态类型就是派生类指针或引用。

  3,静态绑定与动态绑定

   1) 静态绑定:亦或静态联编。在编译程序时就根据调用函数提供的信息,把它所对应的具体函数确定下来(编译时期,把调用函数名与具体函数绑定在一起。)

   2) 动态绑定:亦或动态联编。在编译程序时还不能确定函数调用所对应的具体函数,只有在程序运行过程中才能够确定函数调用所对应的具体函数。

   巧计:动态绑定只发生在继承类的虚函数上(且这个虚函数无缺省参数),其它一概是静态绑定。

二、实例解析


 

  我们看下面这一个示例。

 1 #include <iostream>
 2 using  namespace std;
 3 class A
 4 {
 5 public:
 6     virtual void func(int val = 1) {
 7         cout<< "A->" << val << endl;
 8     }
 9     virtual void test() {
10         func();
11     }
12 
13     virtual void func2() {
14         cout << "Base A" << endl;
15     }
16 };
17 class B : public A
18 {
19 public:
20     void func(int val = 0) {
21         cout<<"B->"<<val <<endl;
22     }
23     void func2() {
24         cout << "Base B" << endl;
25     }
26 };
27 int main(int argc ,char* argv[])
28 {
29     cout << "Virtual function with default parameters." << endl;
30     B*p = new B;    //p的静态类型和动态类型都是 B*
31     p->test();
32     p->func2();
33 
34     cout << endl << "reference work with virtual function." << endl;
35     B objectB;
36     A &objectA = objectB;   //objectA的静态类型是 A&, 动态类型是 B&
37     objectA.func();
38     objectA.func2();
39 
40     cout << endl << "object work with virtual functions." << endl;
41     A objectA2;
42     objectA2.func();
43     objectA2.func2();
44     return 0;
45 }

  1,静态类型,动态类型已在程序中注释

  2,程序输出

  技术分享

  1)第一输出

    这一输出是测试带有缺省参数的虚函数。我们看到,基类虚函数的缺省参数没有被修改。(这一情况,总说纷纭,有的把他归于动态绑定,有的归于静态绑定)。所以,尽量不要定义继承而来的缺省参数。

  2)第二输出

    用基类引用调用派生类虚函数,实现多态。

  3)第三输出

    基类对象调用自家成员函数,忽略virtual关键字。

  

 

9,多态

标签:

原文地址:http://www.cnblogs.com/letgo/p/5808322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!