[英]Pointer to base virtual function vs direct call of base virtual function
為什么這兩個行為不同?
(obj.*lpfn)();
從 C++ 標准:
[expr.call]\/1<\/strong>對於非靜態成員函數的調用,后綴表達式應為隱式 (12.2.2, 12.2.3) 或顯式類成員訪問 (8.2.5),其id-expression<\/em>為函數成員名稱,或指向成員表達式 (8.5) 選擇函數成員; 調用是作為對象表達式引用的類對象的成員...如果所選函數是非虛擬的,或者類成員訪問表達式中的id-expression<\/em>是qualified-id<\/em> ,則調用該函數. 否則,它在對象表達式的動態類型中的最終覆蓋器(13.3)被調用; 這種調用稱為虛函數調用<\/em>。
因此,只有兩種情況下,對非靜態成員函數的調用不執行虛擬調度:1) 函數不是以虛擬開頭的,或 2) 函數以限定名稱命名,如
obj.Base::fn()<\/code> 。
在所有其他情況下——包括通過指向成員的指針調用的情況——最終的覆蓋器被調用。
但是為什么指向設置為 Base implementation((obj.*lpfn)()) 的成員函數調用的指針會導致虛擬調度
因為這就是指定語言的方式。 虛擬分派是一個有用的工具,因此能夠通過指向成員函數的指針使用虛擬分派也很有用。
為什么相同的表達式,除了直接調用 (obj.Base::fn()) 不做虛擬調度?
因為偶爾能夠使用靜態調度很有用。 該語言的設計方式是靜態分派可以通過指定具有限定名稱的靜態類型來完成。
該語言中沒有通過指向虛擬成員函數的指針來使用靜態分派的語法。 我不能告訴你為什么會這樣,但我可以猜想,鑒於虛擬函數的靜態調度是很少需要的特性,而指向成員函數的指針是一個很少需要的特性,可能是它們的組合很少需要它沒有真正考慮過。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.