C++虛函數表實例剖析。本站提示廣大學習愛好者:(C++虛函數表實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++虛函數表實例剖析正文
多態是C++面向對象法式設計的一個主要特征。之前看到虛函數認為很奇異,為何就可以完成多態了呢。最後的時刻曾假想,要完成運轉時多態,應當讓對象的某個部門一直指向一個固定的地址,子類繼續的時刻,就修正這個地址的內容。如許,父類和子類都是到統一個固定地址去讀取內容,在運轉時就可以表示分歧行動。
在看了《深度摸索c++對象模子》以後,發明思緒是相似的。在對象中,有一個指針指向一張虛函數表,外面依照順序寄存了每個虛函數,當子類繼續的時刻,即到虛函數表的指定地位去修正函數地址。當我們經由過程父類指針來操作一個子類的時刻,挪用虛函數,都是經由過程虛函數表+固定的偏移,如許運轉期多態便完成了。
在深度《深度》這本書中,虛函數表年夜多放在了對象的末尾,不曉得如今的編譯器是甚麼樣的,是以本文就來現實做個試驗測試一下。
試驗情況:VC2013 Express
代碼以下:
class Parent { public: int parent; Parent() : parent(10) {} virtual void a() { cout << "Parent::a()" << endl; } virtual void b() { cout << "Parent::b()" << endl; } virtual void c() { cout << "Parent::c()" << endl; } }; class Child : public Parent { public: int child; Child() :child(100) {} virtual void a() { cout << "Child::a()" << endl; } virtual void b_child() { cout << "Child::b_child()" << endl; } virtual void c_child() { cout << "Child::c_child()" << endl; } }; class GrandChild : public Child{ public: int grandchild; GrandChild() :grandchild(1000) {} virtual void a() { cout << "GrandChild::a()" << endl; } virtual void b_child() { cout << "GrandChild::b_child()" << endl; } virtual void c_grandchild() { cout << "GrandChild::c_grandchild()" << endl; } }; int main() { typedef void(*func)(); GrandChild grandchild; int **vtable = (int **)&grandchild; for (int i = 0; (func)vtable[0][i] != nullptr; i++) { auto pfunc = (func)vtable[0][i]; cout << " ["<<i<<"] "; pfunc(); } return 0; }
成果顯示以下圖所示:
確切,虛函數表指針在對象肇端處,並看到了對應項被籠罩。