什么时候我们应该使用方法重载vs不同命名的方法

Che*_*eng 8 c++ oop overloading

有时,我觉得方法超载可能会造成混乱.

class a {
public:
    void copy(float f);
    void copy(double d);
};
Run Code Online (Sandbox Code Playgroud)
a me;
me.copy(1.2); // Not obvious at the first sight on which version we are calling.
Run Code Online (Sandbox Code Playgroud)

对此的解决方法是.

class a {
public:
    void copyFloat(float f);
    void copyDouble(double d);
};
Run Code Online (Sandbox Code Playgroud)

但是,拥有不同名称的方法,执行相同的功能似乎也不是一个好主意.我可以知道,您考虑什么,在方法重载具有不同命名的方法中进行选择?

GMa*_*ckG 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
};
Run Code Online (Sandbox Code Playgroud)

希望你在这里看到问题.如果两个函数具有相同的名称,则它们应该执行相同的操作.

更好的是,如果您只是尝试允许在不同类型上操作的可能性,只需使用模板即可.(这可能是一种超载的形式.)