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

C++ : Semantic issue on a child class with same named method

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

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

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

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

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
}

为了 "unhide" 基 class 函数,派生的 class 就像它有两个重载一样,使用 using 指令:

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