天天看點

C++中的靜态綁定和動态綁定(多态)

C++具有多态的特性,了解多态原理需要了解以下四個概念。

       1、對象的靜态類型(static type):就是它在程式中被聲明時所采用的類型(或了解為類型指針或引用的字面類型),在編譯期确定;

       2、對象的動态類型(dynamic type):是指“目前所指對象的類型”(或了解為類型指針或引用的實際類型),在運作期确定;

       這兩個概念一般發生在基類和派生類之間。

class Base
{
public:
    int a;
    Base()
    {
        a = 1;
        cout << "Base()" << endl;
    }
    ~Base()
    {
        cout << "~Base()" << endl;
    }
};

class Derived : public Base
{
public:
    int b;
    Derived()
    {
        b = 2;
        cout << "Derived()" << endl;
    }
    ~Derived()
    {
        cout << "~Derived()" << endl;
    }
};

int main()
{
    Base *pB = new Derived(); //pB的靜态類型為Base, 動态類型為Derived;
    delete pB;
}
           

        3、靜态綁定(statically bound):又名前期綁定(eraly binding),綁定的是靜态類型,所對應的函數或屬性依賴于對象的靜态類型,發生在編譯期;

        4、動态綁定(dynamically bound):又名後期綁定(late binding),綁定的是動态類型,所對應的函數或屬性依賴于對象的動态類型,發生在運作期;

一般的,virtual函數是動态綁定,non-virtual函數是靜态綁定,預設參數值也是靜态綁定。 

是以~Base()函數是靜态綁定的,是以輸出結果(delete時會調用析構函數)是: 

Base();

Derived();

~Base();

但将基類析構函數改為虛函數時,即:

public:
    int a;
    Base()
    {
        a = 1;
        cout << "Base()" << endl;
    }
    virtual ~Base()
    {
        cout << "~Base()" << endl;
    }
};
           

現在輸出結果是:

Base();

Derived();

~Derived();

~Base();