关于c ++:继承的成员函数的重载

Overloads of inherited member functions

类重载方法是否也存在于公共继承接口中?这似乎是明确和有用的,但编译器(VC,Intel,GCC)都抱怨,至少我的结构。下面是一个玩具例子。继承的breadback()函数有两个明确的重载,但不会编译。如果在任何一个类中重命名rebunding()方法,它都可以正常工作,但是如果它们共享相同的成员函数名(即使它们被不同的参数类型重载!)您会得到一个致命的错误:"函数调用的参数太少。"

解决方法是微不足道的(我只会重命名方法),但我只是想了解这是不是C++限制(为什么会这样)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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);
}

你可以做三件事:

1。取消隐藏基类方法

Node声明中增加using

1
2
using Bound::rebound;
void rebound() { rebound(left, right); }

2。显式引用基类方法

使用绑定的命名空间:

1
void rebound() { Bound::rebound(left, right); }

号三。定义/重定义派生类中的所有重载

将实现委托给基类(如果在头中这样做,则不应该因为内联而受到任何惩罚):

1
2
void rebound(const Bound *a, const Bound *b) { Bound::rebound(a, b); };
void rebound() { rebound(left, right); }

更多信息:https://isocpp.org/wiki/faq/奇怪继承重载派生


当您在子类中声明一个名称相同但签名不同的方法时,它实际上会从父类中隐藏版本。

您可以将它具体地称为bound::rebound(…)或使用using关键字。

请看这里


这被称为隐藏父成员函数。您可以显式地调用它(通过Bound::rebound(left, right)如@ates goral所说),也可以在Node类定义中添加using Bound::rebound

参见http://www. PARASIFIF.COM/C++-FAQLIT/陌生继承。