2011-04-12 110 views
6

Possible Duplicates:
C++ overload resolution
Why does an overridden function in the derived class hide other overloads of the base class?重載方法

爲什麼以下示例:

class A { 
    public: 
     void f(int x){ } 
}; 

class B : public A { 
    public: 
     void f(float a, int b){ } 
}; 

int main(){ 
    B *b = new B; 
    b->f(1); 
}; 

原因:

TEST.CPP:在函數 '詮釋主()': TEST.CPP: 13:錯誤:沒有用於調用'B :: f(int)'的匹配函數 test.cpp:8:注意:候選是:void B :: f(float,int)

f(int)f(float, int)具有不同的簽名。爲什麼會造成錯誤?

編輯

我理解它藏了起來。我在問爲什麼是這種情況?

+0

我想這是隱藏的,因爲B :: f和A:f在不同的範圍。 – pic11 2011-04-12 13:58:54

回答

6

本質上,你不重載基類的方法;通過重新定義方法f,你是隱藏的基類方法。您可以通過它明確到子類範圍如下防止這種情況:

class B : public A { 
    public: 
     using A::f; 
     void f(float a, int b){ } 
}; 
+0

你爲什麼隱藏它?這只是一個規則,還是有編譯器像這樣工作的一些原因? – gruszczy 2011-04-12 13:53:39

+2

@gruszczy這是一條規則。當基類稍後發生變化並引入一個與派生類方法同名的新方法時,它確實有意義。這反過來又可能導致在客戶端代碼中調用舊方法的地方調用新方法。從本質上講,這個規則確保了基類接口可以擴展的代碼的向後可維護性。 – 2011-04-12 13:57:36

1

void f(float a, int b){ }在派生類中定義的基類隱藏void f(int x){ }

爲什麼?

閱讀this解答。

using A::f; // add this above f's definition in the derived class 
2

A :: f由乙隱藏:F。使用using指令來重載基類方法。

class B : public A { 
    public: 
     using A::f; 
     void f(float a, int b){ } 
}; 
3

通過聲明在B類名爲「F」的另一個功能,你都躲在「F」在A.

宣佈

要獲得重載與繼承方一道,添加使用指令您B類。

class B : public A { 
public: 
    using A::f; 
    void f(float a, int b){ } 
}; 

這是因爲編譯器在類B的範圍內查找並且僅找到一個它必須考慮的重載解析方法。