代碼 -
#include<iostream>
using namespace std;
class P {
public:
void print() { cout <<" Inside P"; }
};
class Q : public P {
public:
void print() { cout <<" Inside Q"; }
};
class Q2: public P {
public:
void print2() { cout <<" Inside Q2"; }
};
class R: public Q2, public Q { };
int main(void)
{
R r;
r.print(); // error: request for member ‘print’ is ambiguous
return 0;
}
預期行為: main 中的第 3 行沒有模棱兩可的呼叫。
實際行為: main 中第 3 行的模糊呼叫
基本原理:我希望 Q 類隱藏 P 類的 print() 函式。當 Q2 與 R 或 Q(甚至 P?)具有相同的函式名稱時,我希望會出現模棱兩可的呼叫錯誤。但是我故意將 Q2 中的函式名稱更改為 'print2' 以避免出現此錯誤。當我將“Q2”作為 R 的父類洗掉時,此錯誤消失。這是因為“Q2”從“P”繼承“列印”嗎?
注意:我知道在從多個類繼承的情況下,對于常規繼承和模糊呼叫的資料隱藏已經提出了類似的問題,但這種情況是兩者的混合,我沒有找到任何具體的答案。
uj5u.com熱心網友回復:
我希望 Q 類隱藏 P 類的 print() 函式
這與Q隱藏超類的print().
Q2繼承自P,因此繼承print()。
class R: public Q2, public Q { };
print()是從 Q2 和 Q 繼承的。它們是相同的還是不同的方法并不重要。關鍵是哪個print()方法R.print()決議為模棱兩可。
當 Q2 具有相同的函式名稱時,會出現模棱兩可的呼叫錯誤
但確實如此。它繼承了它。
uj5u.com熱心網友回復:
這是具有多重繼承的非常典型的 C Diamond 問題。
你所擁有的是當 R 呼叫列印函式時,他不知道從哪個列印到 cal。
您可以通過幫助 R 類物件指定要呼叫的列印來解決此問題。
下面的修改可以說明這一點。
#include<iostream>
using namespace std;
class P {
public:
void print() { cout <<" Inside P\n"; }
};
class Q : public P {
public:
void print() { cout <<" Inside Q\n"; }
};
class Q2: public P {
public:
void print2() { cout <<" Inside Q2\n"; }
};
class R: public Q2, public Q { };
int main(void)
{
R r;
r.Q::print();
r.Q2::print();
// r.P::print(); ambiguous base call.
// r.print(); ambiguous member
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/459969.html
下一篇:Haskell子類化和實體重疊
