我们有:
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);}
};
关键字,但它没有区分具有相同名称和不同签名的方法。
答案 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'与之前的使用声明冲突
任何方式,请三思而后行。你想要一个函数,它取决于它调用不同基类成员的参数的数量/类型?我无法想象很多情况都有意义。
--------------结论---------------
theABVar.A::f()
,theABVar.A::f(3)
,theABVar.B::f()
,theABVar.B::f(3)
,{{1 }和theABVar.AB::f(3.0,3.0)
。