我有一個基類A和一個派生類B.A和B都定義了[]運算符,但不具有相同的參數類型。儘管如此,當我嘗試在A類型的對象上使用[]運算符時,arg C++沒有找到A的def。很煩人。什麼是規則?C++運算符繼承和重載
回答
B類中的運算符隱藏了A類中的運算符。這是派生類中定義的任何方法的問題,它們重載超類中的方法。如果名稱查找在B
中找到名稱匹配,則它不會查找A
,即使在B
中找到的匹配不能被調用。
你需要把它納入B的範圍:
class X{};
class Y{};
class A {
public:
auto operator[](X) {};
};
class B : public A {
public:
using A::operator[]; // <-- you need this
auto operator[](Y){};
};
int main() {
A a;
B b;
b[X{}]; // OK
b[Y{}]; // OK
}
謝謝,這就是我想知道的。不過,我不明白爲什麼C++的行爲如此。如果它在B類中找不到操作數匹配,它應該在A中查找。當然!這就是完整的繼承點。 – Henrik
@亨利克 - 不,那會導致神祕的錯誤。假設你已經寫了一個從庫類派生的類,並且你的類有一個成員函數'void foo(double);'。你可以用一個類型爲「int」的參數來調用它,並且該參數將被轉換爲「double」以便進行調用。現在假設庫的維護版本向該基類「void foo(int);'添加了一個成員函數。現在你的代碼會悄悄地調用基類版本,而不是你的版本。 –
@Pete,我不同意。如果第三方提供庫類,它應該發佈帶有文檔的接口,並且它必須保持固定。無論做出什麼樣的改變,只應該影響隱藏的代碼,而不會影響用戶界面或功能。向後兼容性至關重要。這就是行業標準如此緩慢變化的原因。 – Henrik
- 1. C++:繼承和運算符重載
- 2. C++運算符重載和繼承
- 3. 泛型繼承和重載運算符+
- 4. C++類的繼承和運算符重載;操作符重載是否被繼承?
- 5. C#顯式運算符和繼承
- 6. Swift運算符和繼承
- 7. 重載的轉換運算符繼承(Visual C++)
- 8. C++繼承和操作符重載
- 9. 繼承運算符+()
- 10. 繼承運算符()
- 11. 重載<<運算符和繼承類
- 12. 從模板類繼承運算符重載。曖昧過載「運算符*」
- 13. 賦值運算符繼承
- 14. 帶繼承的重載方法/運算符將不起作用
- 15. 如何用繼承來管理運算符重載
- 16. C++運算符在已重載的運算符中重載
- 17. C++運算符重載==
- 18. 運算符重載C++
- 19. 運算符重載C++
- 20. 運算符重載C++
- 21. 運算符重載C++
- 22. C++運算符重載
- 23. +運算符重載在C++
- 24. C++約運算符重載
- 25. 重載枚舉運算符C#和Silverlight
- 26. 對象和運算符重載C++
- 27. C++重載運算符和這
- 28. C++'this'和運算符重載
- 29. 繼承和操作符重載
- 30. C++重載運算符<<和運算符>>
你能告訴你使用使用在[MCVE]代碼? – NathanOliver
你是說你想打電話給A的操作員[]? – thefunkyjunky
@NathanOliver這就是問題所在:要提供一個純粹的必需品清潔版供您檢查。如果你不知道任何禁止我試圖做的規則,我可能不得不這樣做。 – Henrik