2010-08-12 41 views
8

有時候,我覺得方法重載可能會造成混淆。什麼時候應該使用方法重載vs不同命名方法

class a { 
public: 
    void copy(float f); 
    void copy(double d); 
}; 

a me; 
me.copy(1.2); // Not obvious at the first sight on which version we are calling. 

在此解決方法是。

class a { 
public: 
    void copyFloat(float f); 
    void copyDouble(double d); 
}; 

然而,具有不同的名稱的方法,來執行相同的功能似乎不是一個好主意爲好。我是否知道,您認爲如何選擇方法重載方法命名不同

回答

17

確實超載。

好吧,所以它不是「顯而易見」,哪個函數被調用(可爭辯)...那麼是什麼?你不關心它可以採用不同類型的參數,它只需要做它的事情。如果你根據不同的重載有不同的行爲,你濫用重載,並沒有指出它們的缺陷。

濫用重載的例子:

// good: 
struct has_properties 
{ 
    void property1(float); // set property1, which happens to be a float 
    void property2(int); // set property2, which happens to be an int 
}; 

// bad: 
struct has_properties 
{ 
    void property(float); // set property1, abusing that it's a float 
    void property(int); // set property2, abusing that it's an int 
}; 

希望你在這裏看到的問題。如果兩個函數具有相同的名稱,則它們應該執行相同的操作。

更好的是,如果你只是想讓操作不同類型的可能性,只需使用模板。 (這可以說是一種超載。)

0

當然,在float和double的情況下,你不應該重載,這太容易出錯了。我聽說有人爭辯說,在這些情況下,你應該總是使用不同的名稱,以便完全明確,並儘可能讓讀者清楚,並且我傾向於同意。

+3

那麼所有''中的數學函數都不應該被重載,而是會有不同的名字?真是一場噩夢! – GManNickG 2010-08-12 03:45:16

+0

很明顯,這不會很好,我認爲你發佈的例子更符合人們擔心的方面。如果重載確實使得用戶不必擔心它是什麼類型,因爲正確的事情將以任何方式完成,那麼這很好,但是如果根據它是什麼類型發生不同的行爲這就是事情會變得微妙的地方。正如你指出的那樣,這實在是濫用重載。 – bshields 2010-08-12 03:48:26

1

如果你基本上對這兩個函數做同樣的事情,它們只是在類型參數上有所不同,那麼使用模板並且根本不使用重載可能更有意義。

2

我會在評論中,但我還不能。既然你把它標記爲C++,我想我應該告訴你,方法通常在C/C++中被稱爲函數。

+7

方法是一種語言不可知的術語,指的是面向對象編程中與類相關的子例程/函數。這裏的用法是正確的。 – bshields 2010-08-12 04:04:09

2

儘量避免使用具有相同名稱的多個虛擬方法。或者你可能想要在派生類中覆蓋它們。請看下面的例子:

#include <string> 

struct Base { 
    virtual void foo(const std::string& arg) { 
    } 
    virtual void foo(int arg) { 
    } 
}; 

struct Derived : Base { 
    // Only std::string version is overriden. 
    virtual void foo(const std::string& arg) { 
    } 
}; 

int main() { 
    Derived d; 
    // This fails to compile because the name lookup stops 
    // after Derived::foo has been found. 
    d.foo(42); 
} 
+0

您可以通過包含'using'聲明將基類函數帶入派生範圍。現在可以訪問任何在「基礎」中的「foo」重載並且在「派生」中未覆蓋的重載。以下將編譯:'struct Derived:Base {using Base :: foo; virtual void foo(const std :: string&arg){}};' – TheSecretSquad 2013-04-02 02:53:12

0

重載函數是C++的方法來分組這些都對它們的行爲類似的功能。

do_it (A a, B b); 
do_it (B b, int i = 0); 

功能以不同的名稱(例如do_it_with_a或do_it_with_a_b)是C的方法來分組這些都對它們的行爲類似的功能。

所以,如果你的功能在他們的行爲不同,不要超載他們。

相關問題