2015-02-05 77 views
0

爲什麼d.f(1)在這段代碼中調用Derived::fC++ using-declarations從基類調用函數

using Base::f在決定哪個f將被調用時起作用嗎?

#include <iostream> 
using namespace std; 

struct Base { 
    void f(int){ 
     cout << "\n f(Base) is called" ; 
    } 
}; 
struct Derived : Base { 
    using Base::f ; // using-declarations but still Drived function is called 
    void f(int){ 
     cout << "\n f(Derived) is called" ; 
    } 
}; 
void use(Derived d) 
{ 

    d.f(1);  // calls Derived::f 
    Base& br = d ; 
    br.f(1);  // calls Base::f 
} 

int main() { 

     Derived d; 
     use (d); 
     return 0; 
} 
+1

'僅使用Base :: f'只適用於在Derived中沒有超級函數的情況。只要你有一個聲明/定義,這個被稱爲。 – 2015-02-05 18:38:49

+0

如果Base :: f和Derived :: f有不同的參數(這裏隱藏了唯一(使用)函數和派生函數) – 2015-02-05 18:41:17

+0

當我在VS2013 Update 4中運行代碼時,它調用派生,然後基地。你是否在說它是派生的,然後派生出來的? – 2015-02-05 18:57:29

回答

5

在派生類的功能void f(int)隱藏函數中的鹼,因爲它們具有相同的名稱和參數。

它被解釋爲here: 使用聲明在派生類定義中引入了一個基類的成員,例如將base的受保護成員公開爲派生的公共成員。在這種情況下,嵌套名稱說明符必須命名正在定義的基類。如果該名稱是基類的重載成員函數的名稱,則將引入具有該名稱的所有基類成員函數。如果派生類已經具有名稱相同的成員,參數列表和限定條件,則派生類成員隱藏或覆蓋(不衝突)從基類引入的成員。