2012-02-19 63 views
1

假設結合:C++動態超載

struct A { 
    virtual int foo(const A& a) const { return 1; } 
}; 

struct B : A { 
    virtual int foo(const A& a) const { return 2; } 
    virtual int foo(const B& b) const { return 3; } 
}; 

void testOverloadingBinding(const A& a,const B& b) { 
    cout << a.foo(b); 
} 

int main() { 
    testOverloadingBinding(B(),B()); 
} 

它打印2.我會假設它打印3,因爲this結合是動態的,而據我所知超載有靜態綁定。 任何人都可以請解釋編譯器如何決定在這裏調用哪個函數?

回答

4

此:

virtual int foo(const B& b) const; 

不是此一控制裝置:

virtual int foo(const A& a) const; 

因此它不可能通過一個A參考被調用。

1
virtual int foo(const B& b) const; 

不重寫任何東西,所以編譯器選擇第一個函數。但是,可能在將來,我們將有一個動態類型解析,在這種情況下,編譯器會選擇第二個函數。 欲瞭解更多信息,請參閱http://www2.research.att.com/~bs/multimethods.pdf

+0

是什麼讓你認爲C++將在未來支持雙派遣? – 2012-02-19 20:50:46

+0

@Oli Charlesworth 1 - 它將簡化模式訪問者。 2 - 開銷將只在虛擬類型定義的情況下(見提議)。 3 - 它將簡化multimethods的使用。 4 - 它是來自Bjarne Stroustrup的倡議:) – innochenti 2012-02-19 21:39:24

1

沒有超載可供解決。您調用foo的對象的類型爲A,而在A中只有一個功能foo(const A&)存在。動態分派產生基類中的函數。在C++中,成員函數由其名稱和參數標識。在父項中不存在的基礎中添加重載將不會啓用動態分派。