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();