2015-09-20 58 views

回答

1

它與名稱隱藏無關。在C++對象模型中,對象包含以下內容:成員(成員變量和成員函數,後者不佔用「空間」),並且如果至少有一個成員函數被標記爲virtual,則指向虛擬表的指針功能。每當你碰到這樣的Base* p = new Derived; p->f();,在兩種可能的方法之一編譯收益:

  1. 如果f標虛,呼叫被翻譯成p->vpointer[index_of_f_in_vtable]();,即f通過指針調用VTable的,它具有調用Derived::f()的效果;
  2. 如果f不是虛擬的,則由於指針的類型爲Base而被調用Base::f()

在你的情況下,沒有虛擬表,所以Base::f()被調用。

參見例如this Wikipedia article的更詳細的解釋。

+0

因此,「名稱隱藏」概念(其中派生類方法重寫具有相同名稱的基類方法)不適用於此? – Bateman

+0

@KhanZaid不,它不適用於此。在調用'p-> f();'中,函數'f'對Base和Derived必須是共同的,具有完全相同的簽名(高達[返回類型的協方差](http:// stackoverflow。 COM /問題/ 1260757 /時,是-C-協方差的最佳解決方案))。 – vsoftco