2

我们有:

class A {
public:
    int f();
    int f(int);
  //...
};
class B {
public:
    int f();
    int f(int);
  //...
};
class AB : public A, public B {
public:
    long f(double, double);
  //...
};

A::f(), A::f(int), B::f(),B::f(int)现在隐藏在 中class AB,我只想使用它们A::f()B::f(int)就好像它们没有被隐藏一样:

AB ab;
ab.f();  // ab.A::f()
ab.f(1); // ab.B::f(1)

有没有比编写以下代码更简单的方法来实现这一点?

class AB : public A, public B {
public:
  //...
    int f() {return A::f();}
    int f(int x) {return B::f(x);}
};

我想到了using关键字,但它不区分具有相同名称和不同签名的方法。

4

1 回答 1

2

唯一的方法是声明它们并在编写时调用所需的基类函数。

您可能已经考虑过以某种奇怪的方式使用“使用”例如:using A::f;但是你继承了所有相同的函数签名,你不能指定一个。

AB类声明中的内容是:

  • 只有继承

您从两个基类中获得了接口和实现,当调用它们共同的方法时会出错(注意!即使签名不一样)。 theABVar.A::f();会给你:

错误:“对成员 'f' 的请求不明确”

但是你可以解决这个问题theABVar.A::f();(这不是很酷吗?:D)

  • 当您在两个基类中添加同名的方法时

基类中的成员被隐藏,因此,对该方法的调用不再模棱两可。
但是要在基类上调用方法,您应该使用与以前相同的技巧。

theABVar.f();会给你

Ettor:没有匹配函数调用'AB::f()'

  • 当您尝试对基类函数使用“使用”时,即使您不使用该函数,您也会获得编译时间:

    使用 A::f; 使用 B::f;

using 声明 'using B::f' 与之前的 using 声明冲突

无论如何,请三思而后行。
你想要一个函数,它取决于它调用不同基类成员的参数的数量/类型?我无法想象很多情况下这是有道理的。

- - - - - - - 结论 - - - - - - - -

  1. 三思而后行。隐藏方法通常不好。
  2. 在您的第一个示例中,客户端可以使用显式调用(他们将能够访问所有公共成员)theABVar.A::f()、、、、和。theABVar.A::f(3)theABVar.B::f()theABVar.B::f(3)theABVar.AB::f(3.0,3.0)theABVar.f(3.0,3.0)
  3. 您可以按照您的要求创建您需要的函数(没有更简单的事情),但请记住,客户端仍然可以调用您的基本函数!
于 2013-05-29T21:58:15.153 回答