C++在面向對象編程中,存在著靜態綁定和動態綁定的定義,本節即是主要講述這兩點區分。
我是在一個類的繼承體系中分析的,因此下面所說的對象一般就是指一個類的實例。
首先我們需要明確幾個名詞定義:
靜態類型:對象在聲明時采用的類型,在編譯期既已確定;
動態類型:通常是指一個指針或引用目前所指對象的類型,是在運行期決定的;
靜態綁定:綁定的是靜態類型,所對應的函數或屬性依賴於對象的靜態類型,發生在編譯期;
動態綁定:綁定的是動態類型,所對應的函數或屬性依賴於對象的動態類型,發生在運行期;
從上面的定義也可以看出,非虛函數一般都是靜態綁定,而虛函數都是動態綁定(如此才可實現多態性)。
先看代碼和運行結果:
class A { public: /*virtual*/ void func(){ std::cout << "A::func()\n"; } }; class B : public A { public: void func(){ std::cout << "B::func()\n"; } }; class C : public A { public: void func(){ std::cout << "C::func()\n"; } };
下面逐步分析測試代碼及結果,
1 C* pc = new C(); //pc的靜態類型是它聲明的類型C*,動態類型也是C*;
2 B* pb = new B(); //pb的靜態類型和動態類型也都是B*;