程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 從零開始學C++之虛函數與多態(一):虛函數表指針、虛析構函數、object slicing與虛函數

從零開始學C++之虛函數與多態(一):虛函數表指針、虛析構函數、object slicing與虛函數

編輯:C++入門知識

一、多態

多態性是面向對象程序設計的重要特征之一。
多態性是指發出同樣的消息被不同類型的對象接收時有可能導致完全不同的行為。
多態的實現:


函數重載

運算符重載

模板

虛函數

(1)、靜態綁定與動態綁定

靜態綁定

綁定過程出現在編譯階段,在編譯期就已確定要調用的函數。
動態綁定

綁定過程工作在程序運行時執行,在程序運行時才確定將要調用的函數。

 


二、虛函數

虛函數的概念:在基類中冠以關鍵字 virtual 的成員函數
虛函數的定義:


virtual 函數類型 函數名稱(參數列表);

如果一個函數在基類中被聲明為虛函數,則他在所有派生類中都是虛函數

只有通過基類指針或引用調用虛函數才能引發動態綁定
虛函數不能聲明為靜態

 

 

(1)、虛函數表指針

虛函數的動態綁定是通過虛函數表來實現的。(虛函數表存放虛函數的函數指針)
包含虛函數的類頭4個字節存放指向虛函數表的指針


注意:若不是虛函數,一般的函數不會出現在虛函數表,因為不用通過虛函數表指針間接去訪問。

 

 

 C++ Code 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  #include <iostream>
using namespace std;


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

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

    void Fun3() //被Derived繼承後被隱藏
    {
        cout << "Base::Fun3 ..." << endl;
    }
};

class Derived : public Base
{
public:
    /*virtual */
    void Fun1()
    {
        cout << "Derived::Fun1 ..." << endl;
    }

    /*virtual */void Fun2()
    {
        cout << "Derived::Fun2 ..." << endl;
    }

    void Fun3()
    {
        cout << "Derived::Fun3 ..." << endl;
    }
};

int main(void)
{
    Base *p;
    Derived d;

    p = &d;
    p->Fun1();      // Fun1是虛函數,基類指針指向派生類對象,調用的是派生類對象的虛函數(間接)
    p->Fun2();
    p->Fun3();      // Fun3非虛函數,根據p指針實際類型來調用相應類的成員函數(直接)

    Base &bs = d;
    bs.Fun1();
    bs.Fun2();
    bs.Fun3();

    d.Fun1();
    d.Fun2();
    d.Fun3();

    return 0;
}

 

 


 

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved