C++多态、重载和继承

C++ polymorphism, overloading and inheritance

给定

#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

我真的不明白为什么,我期待 class C 可以访问 B::a()

似乎正在将 C.a() 解析为 C.a(int)。基本上来自 B 的虚拟方法是不可见的。任何人都知道为什么?

编辑

这个想法是这样的:A as "interface", B as "abstract class", C the "concrete class"

解决方案

我试图实现的目标可以通过 using A::a using B::a 并将 B::a() 调用从 A::a(0) 更改为 a(0)

喜欢这个例子here provided by songyuanyao

C::a隐藏B::a。当在 class C 的范围内找到名称 a 时,name lookup 停止,将不会检查包括 class B 在内的其他范围.

name lookup examines the scopes as described below, until it finds at least one declaration of any kind, at which time the lookup stops and no further scopes are examined.

您可以添加 using 以将 B::a 引入 C 的范围。

class C : public B
{
public:
    using B::a;
    virtual int a(const int i) const { return i; }
};