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;
};
这是一个关于在 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;
};