给定
#include <iostream>
#include <string>
using std::cout;
using std::endl;
class A
{
public:
virtual int a() const = 0;
virtual int a(const int i) const = 0;
};
class B : public A
{
public:
virtual int a() const { return A::a(0); }
};
class C : public B
{
public:
virtual int a(const int i) const { return i; }
};
int main()
{
C c;
cout << c.a() << endl;
cout << c.a(1) << endl;
}
我没有用不同的编译器进行测试,但我有以下错误:
main.cpp:31:17: error: no matching function for call to ‘C::a()’
cout << c.a() << endl;
^
main.cpp:24:17: note: candidate: virtual int C::a(int) const
virtual int a(const int i) const { return i; }
^
main.cpp:24:17: note: candidate expects 1 argument, 0 provided
我真的不明白为什么,我期望类C
可以访问B::a()
。
似乎是将C.a()
分解为C.a(int)
。基本上,B
中的虚拟方法是不可见的。有人知道为什么吗?
编辑
这个想法类似于:A
是"接口",B
是"抽象类",C
是"具体类">
解决方案
我试图实现的是使用using A::a
using B::a
并将B::a()
调用从A::a(0)
更改为a(0)
。
就像宋元耀提供的例子
C::a
隐藏B::a
。当在类C
的作用域中找到名称a
时,名称查找停止,将不会检查包括类B
在内的其他作用域。
名称查找按如下所述检查作用域,直到它至少找到一个任何类型的声明,此时查找停止,不再检查其他作用域。
您可以添加using
以将B::a
引入C
的范围。
class C : public B
{
public:
using B::a;
virtual int a(const int i) const { return i; }
};