类是否可以重载公共继承接口中也存在的方法? 这似乎是明确和有用的,但编译器(VC,英特尔,GCC)都抱怨,至少我的建设。 以下是玩具示例。继承的rebound()函数有两个明确的重载,但这不会编译。如果重命名任一类中的rebound()方法,它可以正常工作,但如果它们共享相同的成员函数名称(即使它们使用不同的参数类型重载!),您会收到致命的错误“函数调用的参数太少了。”
解决方法很简单(我只是重命名方法)但我只是想了解这是否是C ++限制(以及为什么会这样)。
#include
class Bound {
public:
Bound() : x0(0.0), x1(0.0) {};
Bound(double x) : x0(x), x1(x) {};
double width() const {return x1-x0;}
void rebound(const Bound *a, const Bound *b);
private:
double x0, x1;
};
void Bound::rebound(const Bound *a, const Bound *b)
{
if (a && b) {
x0=std::min(a->x0, b->x0);
x1=std::max(a->x1, b->x1);
}
}
class Node : public Bound {
public:
Node(double x) : Bound(x), left(0), right(0) {};
Node(Node *a, Node *b) : left(a), right(b) {rebound();}
void rebound() { rebound(left, right); }
private:
Node *left;
Node *right;
};
int main() {
Node A(1.0);
Node B(2.0);
Node C(&A, &B);
}
答案 0 :(得分:22)
你可以做三件事:
在using
声明中添加Node
:
using Bound::rebound;
void rebound() { rebound(left, right); }
使用Bound命名空间:
void rebound() { Bound::rebound(left, right); }
将实现委托给基类(如果在标题中完成,则内联不应该有任何惩罚):
void rebound(const Bound *a, const Bound *b) { Bound::rebound(a, b); };
void rebound() { rebound(left, right); }
更多信息: https://isocpp.org/wiki/faq/strange-inheritance#overload-derived
答案 1 :(得分:2)
答案 2 :(得分:1)
这称为隐藏父成员函数。你可以明确地调用它(Bound::rebound(left, right)
为@Ates Goral说),或者你可以在using Bound::rebound
类定义中添加Node
。
有关详细信息,请参阅http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9。