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

时间:2013-05-29 21:28:50

标签: c++ class inheritance using access-specifier

我们有:

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()和{{ 1}}好像它们没有被隐藏:

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

1 个答案:

答案 0 :(得分:1)

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

你可能想过以某种奇怪的方式使用"using" ex:using A::f;但是你继承了所有的功能签名,你不能指定一个。

AB类声明中的事情是:

  • 只有继承

你从两个基类获得了接口和实现,在调用两者都常见的方法时会出错(注意!即使签名不相同)。 theABVar.A::f();会给你:

  

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

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

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

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

theABVar.f();会给你

  

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

  • 当您尝试将“using”用于基类函数时 即使您不使用该功能,您也将获得编译时间:

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

  

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

任何方式,请三思而后行。你想要一个函数,它取决于它调用不同基类成员的参数的数量/类型?我无法想象很多情况都有意义。

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

  1. 三思而后行。隐藏方法通常不太好。
  2. 在您的第一个示例中,客户端可以使用显式调用(他们将能够访问所有公共成员)theABVar.A::f()theABVar.A::f(3)theABVar.B::f()theABVar.B::f(3),{{1 }和theABVar.AB::f(3.0,3.0)
  3. 您可以按照指定创建所需的功能(没有简单的事情),但请记住,客户仍然可以称之为基本功能!