访问具有不同签名的基类中的隐藏函数

Accessing hidden functions from base classes with different signatures

本文关键字:基类 隐藏 函数 访问      更新时间:2023-10-16

我们有:

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关键字,但它无法区分具有相同名称和不同签名的方法。

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

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

AB类声明中的内容是:

  • 只有遗产

如果从这两个基类都获得了接口和实现,那么在调用它们共同的方法时会出现错误(注意!即使签名不相同(。theABVar.A::f();会给你:

错误:"对成员'f'的请求不明确">

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

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

基类中的成员被隐藏了,因此,对该方法的调用不再含糊
但是要在基类上调用方法,您应该执行与以前相同的技巧。

theABVar.f();会给你

Ettor:没有用于调用"AB::f(("的匹配函数

  • 当您尝试对基类函数使用"using"时即使你不使用函数,你也会得到编译时间

    使用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. 您可以根据指定创建所需的函数(没有比这更简单的事情了(,但请记住,客户端仍然可以调用基本函数