2013-04-08 56 views
3

最近我開始知道這一點 - 如果派生類重新定義基類成員方法,則所有具有相同名稱的基類方法都隱藏在派生類中。隱藏基類中的所有重載方法

#include<iostream> 

using namespace std; 

class Base 
{ 
public: 
int fun() 
{ 
    cout<<"Base::fun() called"; 
} 
int fun(int i) 
{ 
    cout<<"Base::fun(int i) called"; 
} 
}; 

class Derived: public Base 
{ 
public: 
int fun() 
{ 
    cout<<"Derived::fun() called"; 
} 
}; 

int main() 
{ 
Derived d; 
d.fun(5); // Compiler Error 
return 0; 
} 

錯誤: 在函數 '廉政的main()': 第30行:錯誤:調用 '派生::樂趣(INT)' 編譯因爲-Wfatal,錯誤不匹配功能。

但只是想知道背後的原因?爲什麼它不叫調用基類的方法(因爲派生類是從基類派生的)

+0

你得到哪個編譯器錯誤? – CAMOBAP 2013-04-08 13:54:05

+0

可能的重複:http://stackoverflow.com/q/4837399/951890 – 2013-04-08 13:54:08

+0

@ vaughn:我通過提供的鏈接,但我不太清楚。多數民衆贊成爲什麼再次發佈此問題:) – 2013-04-08 14:03:04

回答

5

的根本原因是爲了使代碼更健壯。

struct Base { 
}; 

struct Derived : Base { 
    void f(long); 
    void g() { f(3); } // calls Derived::f 
} 

現在假設Base在庫中定義的,你會得到一個更新該庫和更新改變的Base定義:

struct Base { 
    void f(int); 
}; 

現在假設對函數重載的搜索沒有當名字被找到時停止。在這種情況下,Derived::g將會調用Base::f而不是Derived::f,並且派生類將靜靜地做一些與之前完全不同的事情,並且與設計和記錄的事情不同。

2

你已經發現派生類的重載會影響(阻止可見性)基類方法名稱但參數不同。讓我們只聲稱這是爲一些歷史或避險的原因做了,看看修復:

class Derived: public Base 
{ 
public: 
    using Base::fun; // expose the base-class method 
    int fun() 
    { 
    cout<<"Derived::fun() called"; 
    } 
};