0
關於answer,爲什麼基類的非虛方法在通過指向派生對象的基類指針調用時會得到「名稱隱藏」?我已編輯該帖子來解釋我的疑問,但沒有得到回答我的previous doubt的朋友的迴應。Static Polymorphism part2中的歧義
關於answer,爲什麼基類的非虛方法在通過指向派生對象的基類指針調用時會得到「名稱隱藏」?我已編輯該帖子來解釋我的疑問,但沒有得到回答我的previous doubt的朋友的迴應。Static Polymorphism part2中的歧義
它與名稱隱藏無關。在C++對象模型中,對象包含以下內容:成員(成員變量和成員函數,後者不佔用「空間」),並且如果至少有一個成員函數被標記爲virtual
,則指向虛擬表的指針功能。每當你碰到這樣的Base* p = new Derived; p->f();
,在兩種可能的方法之一編譯收益:
f
標虛,呼叫被翻譯成p->vpointer[index_of_f_in_vtable]();
,即f
通過指針調用VTable的,它具有調用Derived::f()
的效果;f
不是虛擬的,則由於指針的類型爲Base
而被調用Base::f()
。在你的情況下,沒有虛擬表,所以Base::f()
被調用。
參見例如this Wikipedia article的更詳細的解釋。
因此,「名稱隱藏」概念(其中派生類方法重寫具有相同名稱的基類方法)不適用於此? – Bateman
@KhanZaid不,它不適用於此。在調用'p-> f();'中,函數'f'對Base和Derived必須是共同的,具有完全相同的簽名(高達[返回類型的協方差](http:// stackoverflow。 COM /問題/ 1260757 /時,是-C-協方差的最佳解決方案))。 – vsoftco