簡體   English   中英

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

我真的不明白為什么,我期待C類可以在B::a()訪問。

似乎將Ca()解析為Ca(int) 基本上來自B的虛擬方法是不可見的。 有誰知道為什么?

編輯

這個想法是這樣的: A作為“接口”, B作為“抽象類”, C作為“具體類”

解決方案

我試圖實現的目標是using A::ausing B::a並將B::a()調用從A::a(0)更改為a(0)

類似的例子在這里提供songyuanyao

C::a隱藏B::a 當名稱a在類C的范圍內找到時, 名稱查找將停止,包括類B在內的其他范圍將不會被檢查。

名稱查找按如下所述檢查作用域,直到找到至少一個任何類型的聲明,此時查找停止並且不再檢查進一步的作用域。

您可以添加usingB::a引入C的范圍。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM