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()as C.a(int)基本上,虚拟方法fromB是不可见的。有人知道为什么吗?

编辑

这个想法就像:A作为“接口”,B作为“抽象类”,C“具体类”

我试图实现是可能的using A::a using B::a,并改变B::a()从呼叫A::a(0)a(0)

类似的例子在这里提供songyuanyao

songyuanyao

C::a B::a当在aclass的范围内找到名称C名称查找将停止,B不会检查包括class在内的其他范围

名称查找按如下所述检查范围,直到找到至少一个任何类型的声明为止,这时查找停止并且不再检查任何范围。

您可以添加using引进B::aC的范围。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章