我有一个关于C++中下标运算符、重载和继承的问题。我相信,如果你有一个包含多个函数重载的父类,子类可以覆盖其中一个函数并继承其他函数。但这似乎不适用于下标运算符。(我做出了错误的假设。它与任何其他函数没有区别。)请考虑以下代码:
struct A {};
struct B {};
struct Parent
{
virtual ~Parent() {}
virtual int operator[](A index) { return -1; }
virtual int operator[](B index) { return -2; }
};
struct Child : public Parent
{
virtual int operator[](B index) override { return -3; }
};
int main()
{
// error: no match for 'operator[]' (operand types are 'Child' and 'A')
return Child()[A()];
}
我希望它使用父级的下标运算符而不是导致错误。是否可以从父级继承一些重载的下标运算符并覆盖其他运算符?如果不行,有没有比以下方法更好的解决方案:
struct Child : public Parent
{
virtual int operator[](B index) override { return -3; }
// Force it to use the parent method
virtual int operator[](A index) override { return Parent::operator[](index); }
};
由于我可能从父对象继承多个位置,为了方便维护,手动指定函数是不好的。感谢您的想法。
using Parent::operator[]
,但是你仍然需要在每个类中编写它。 - Weak to Enuma ElishChild::operator[](B)
并停止寻找其他重载,因此它永远不会看到接受A
的版本。如果像@JamesRoot建议的那样使用using Parent::operator[]
,它将把所有其他重载带入Child
的范围内,因此重载将按预期工作。 - 0x5453f
的普通函数,你会遇到相同的编译错误。 - Christian Hackl