[英]Statically chosen function and virtual function
最近我看到了這個C ++標准段落( http://eel.is/c++draft/expr.post#expr.call-5 ):
如果postfix-expression指定析構函數,則函數調用表達式的類型為void; 否則,函數調用表達式的類型是靜態選擇函數的返回類型(即,忽略虛擬關鍵字),即使實際調用的函數的類型不同。 此返回類型應為對象類型,引用類型或cv void。
我真的不明白這一部分:
函數調用表達式的類型是靜態選擇函數的返回類型(即,忽略虛擬關鍵字),即使實際調用的函數的類型不同。
即使實際調用的函數類型不同。
調用表達式如何實際調用所選擇的不同類型的函數?
虛函數可以有協變返回類型,
所以
struct Base
{
virtual ~Base() = default;
virtual Base* Clone() const { return new Base(*this); }
};
struct Derived : Base
{
// covariant return type:
Derived* Clone() const override { return new Derived(*this); }
};
然后
Derived d;
Base& b = d;
auto* clonePtr = b.Clone(); // `auto` is `Base`, even if `Derived::Clone` is called.
// runtime type of `clonePtr` is `Derived`
std::unique_ptr<Base> clone(clonePtr); // Done in 2 steps for explanation
首先,舉例說明。
struct B {
virtual B* f() { return this; }
};
struct D : B {
D* f() override { return this; }
};
void bar(B*) {}
void bar(D*) {}
int main() {
D d;
B& b = d;
bar(b.f()); // calls `bar(B*)`
}
這里,后綴表達式bf
指定一個函數。 它是B::f
,其返回類型是B*
。 即使覆蓋f
指定的返回類型是協變( D*
)。 實際調用(假設)在運行時解決的事實並沒有改變我們靜態選擇函數身份的事實。 當涉及到超載時,它是相關的。 相同的函數名稱可以指定兩個或多個函數,並且(靜態地)選擇要調用的重載的重載決策。 可以在派生類中重寫該重載,但其身份也是靜態的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.