簡體   English   中英

靜態選擇的功能和虛擬功能

[英]Statically chosen function and virtual function

最近我看到了這個C ++標准段落( http://eel.is/c++draft/expr.post#expr.call-5 ):

如果postfix-expression指定析構函數,則函數調用表達式的類型為void; 否則,函數調用表達式的類型是靜態選擇函數的返回類型(即,忽略虛擬關鍵字),即使實際調用的函數的類型不同。 此返回類型應為對象類型,引用類型或cv void。

我真的不明白這一部分:

函數調用表達式的類型是靜態選擇函數的返回類型(即,忽略虛擬關鍵字),即使實際調用的函數的類型不同。

  1. 這里靜態選擇的功能是什么?
  2. 虛擬功能如何靜態選擇? 我一直以為它是在運行時選擇的。
  3. 即使實際調用的函數類型不同。

調用表達式如何實際調用所選擇的不同類型的函數?

虛函數可以有協變返回類型,

所以

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM