我一直认为基类的公共方法确实被派生类继承,甚至认为派生类没有定义该特定方法。例如
#include <iostream>
using namespace std;
class A {
public:
int f() { cout << 3; return 0;}
int f(int x) {cout << x; return 0;}
};
class B: public A {
public:
int f() {std::cout << 5; return 0;}
};
int main(){
B ob;
ob.f(7);
return 0;
}
我期待结果为:7,但是我收到编译错误
&#34; 错误:函数调用的参数太多,预期为0,有1;你的意思是&#39; A :: f&#39;?&#34;
我知道错误试图说的是什么,但我很困惑,没有调用Base类的功能。
答案 0 :(得分:6)
在派生类中重载方法会隐藏所有基类版本。即使签名不同。如果一个与基类同名的方法存在于派生类中,那么你将无法直接调用base班级版本。
你可以做到
ob.A::f(7);
答案 1 :(得分:2)
使用您发布的代码,B::f
会隐藏A::f
的所有版本。您可以使用几种方法从A::f(int)
类型的对象中调用B
。
明确使用A::f
。
B ob;
ob.A::f(7);
将A::f
的所有版本纳入B
的范围。
class B: public A {
public:
using A::f;
int f() {std::cout << 5; return 0;}
};
现在你可以使用:
B ob;
ob.f(7);
答案 2 :(得分:2)
您可以使用其他方式:
class B: public A {
public:
using A::f;
int f() {std::cout << 5; return 0;}
};