[英]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::a
和using B::a
並將B::a()
調用從A::a(0)
更改為a(0)
。
類似的例子在這里提供songyuanyao
C::a
隱藏B::a
。 當名稱a
在類C
的范圍內找到時, 名稱查找將停止,包括類B
在內的其他范圍將不會被檢查。
名稱查找按如下所述檢查作用域,直到找到至少一個任何類型的聲明,此時查找停止並且不再檢查進一步的作用域。
您可以添加using
將B::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.