在基類的成員函數中如果有使用virtual關鍵字修飾的函數,實例化時就會產生一張對應這個類的對象的虛函數表,而這個函數本來應該是函數入口的,而現在變成了虛函數表的入口地址。然后通過虛函數表內找到函數的地址。
比如有這樣兩個類
class Base {public: virtual int fun() { return 0; }};class BaseSon:public Base {};其中:Base這個基類的fun函數是虛函數,實例化后,在這里存在的函數指針地址會被存到這個對象對應的一個虛函數表中,而這里的地址被換成了虛函數表地址。
Baseson繼承的Base的fun函數,但是也是存在一個虛函數表(這張表和上面那張不是同一張),同樣里面有Base的fun函數的函數地址(入口地址)。而且重點是,這個地址在這兩張表中的相對位置相同,也就是偏移量相同。
class Base {public: virtual int fun() { return 0; }};class BaseSon:public Base {public: virtual int fun(){ return 1; }};在這種情況中,這里Base類和上面一致。但是BaseSon類的虛函數表內的那個地址被換成了BaseSon自己的那個return1的fun函數的入口地址。所以,可以通過使用基類的指針來訪問派生類的fun函數,這樣就可以實現動態多態,同一個命令對不同對象使用時,實現不同的功能。
新聞熱點
疑難解答
圖片精選