【问题标题】:Accessing hidden functions from base classes with different signatures从具有不同签名的基类访问隐藏函数
【发布时间】:2013-05-29 21:28:49
【问题描述】:

我们有:

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

【问题讨论】:

  • 否 - 如果您需要指定特定签名,您的解决方案可以替代使用毯子。

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


【解决方案1】:

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

你可能想过以某种奇怪的方式使用"using" 例如: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. 您可以按照自己的要求创建所需的函数(没有更简单的事情),但请记住,客户端仍然可以调用您的基本函数!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多