访问具有不同签名的基类中的隐藏函数
Accessing hidden functions from base classes with different signatures
我们有:
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声明冲突
无论如何,要三思而后行
您想要一个函数,它根据调用不同基类成员的参数数量/类型而定?。我无法想象在很多情况下这是有意义的。
--------------结论--------------
- 三思而后行。隐藏方法通常不好
- 在第一个示例中,客户端可以使用显式调用(它们将能够访问所有公共成员(
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)
- 您可以根据指定创建所需的函数(没有比这更简单的事情了(,但请记住,客户端仍然可以调用基本函数
相关文章:
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 隐藏用于聚合初始化的空基类
- 如何隐藏模板基类的参数类型
- 隐藏的成员变量不应在仅允许const访问的基类中突变,以便保留分配运算符
- 在派生类接口中隐藏基类的特定函数
- 为什么基类函数没有被同名的派生类函数隐藏
- 在派生类中使用声明并不能隐藏从基类派生的相同函数
- 有没有一种聪明的方法可以禁止通过派生类之一隐藏基类的运算符函数
- 为什么继承的函数隐藏在这个代码的基类中
- 取消隐藏派生中基类中具有相同名称和不同签名的某些函数
- 使用"using"声明隐藏基类方法不适用于赋值运算符
- 从模板基类中取消隐藏模板化的强制转换运算符
- 防止重写和/或隐藏基类函数(C++11)
- SFINAEd-out 函数是否隐藏了从基类显式导入的重载
- 访问具有不同签名的基类中的隐藏函数
- 如何处理基类函数已经重载不同访问权限时的名称隐藏问题
- 名称隐藏和访问基类的非虚函数(语法)
- 多态性和数据隐藏:基类是覆盖还是忽略派生类的访问限制?
- 基类模板成员函数隐藏在派生类中,尽管参数列表不同
- 隐藏基类中的所有重载方法