C++多态性、重载和继承



给定

#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::ausing 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; }
};

最新更新