原諒不明確的標題。這可能是重複的,但我找不到正確的詞組。具有不同簽名的兩個函數的繼承隱藏非虛函數
考慮以下繼承層次結構。
class A
{
public:
virtual void Foo(int i) { printf("A::Foo(int i)\n"); }
void Foo(int a, int b) { Foo(a + b); }
};
class B : public A
{
public:
void Foo(int i) override { printf("B::Foo(int i)\n"); }
};
class C : public B
{
public:
void Bar() { Foo(1, 2); } //error C2660: function does not take two arguments
};
A
有一個名爲Foo
用不同數量的參數兩種方法。其中只有一個是虛擬的。
B
覆蓋虛擬方法。
C
嘗試調用非虛方法並遇到錯誤。
調用該方法爲A::Foo(1, 2)
確實工作正常。
問題: 爲什麼編譯器不能推斷在A
上找到了正確的方法?
這似乎很奇怪,我們將不得不在一個調用,如明確添加A::
:
C c;
c.A::Foo(1, 2);
您可以添加使用'A ::富;''在B',然後重載'Foo'是沒有尷尬的語法進行訪問。 – davidhigh
@davidhigh很好的解決方法,謝謝! – Rotem