C++:具有相同命名方法的子类的语义问题



这是一个关于在C++中设计类的问题。

我的基类有一个带参数的虚拟final方法,它的名称基本上是"update"。在一个子类中,我想使用更高级别的方法来更新对象,所以我也制作了一个名为"update"的方法(为了方便(,但这个方法没有参数。Clang警告我该方法隐藏了一个基类方法。在我看来,我并不完全同意这一点,因为签名不同,它应该只是完成重载。

有充分的理由不这么做吗?

警告告诉您,派生类中的函数使在派生类型的对象上调用原始基类函数变得更加困难:

class Base {
public:
virtual void update(int param) final;
};
class Derived : public Base {
public:
void update();
};
void f(Derived& obj) {
obj.update(2); // Error!
// Name lookup for update finds only Derived::update,
// which takes no arguments
}

要"取消隐藏"基类函数,使派生类的行为就好像它有两个重载一样,请使用using指令:

class Derived : public Base {
public:
void update();
using Base::update;
};

最新更新