下标运算符的 C++ 继承规则
C++ Inheritance Rules for Subscript Operator
我有一个关于 C++ 中的下标运算符、重载和继承的问题。 我很确定,如果您的父 class 具有多个函数重载,则子项可以仅覆盖其中一个函数并继承其余函数。这似乎不适用于下标运算符。(我做了一个错误的假设。它实际上与任何其他函数没有什么不同。)考虑以下代码:
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); }
};
由于我可能从父级继承了很多地方,并且必须手动指定这样的功能不利于维护。谢谢你的想法。
在 C++ 中避免两件事:
- 混合重载和覆盖。
- Public 虚函数(如果不是析构函数)。
保持你的基础-class 重载运算符是非虚的,并让它们委托给具有不同名称的私有虚函数。
这是一个例子:
struct A {};
struct B {};
struct Parent
{
virtual ~Parent() {}
int operator[](A index) { return withA(index); }
int operator[](B index) { return withB(index); }
private:
virtual int withA(A index) { return -1; }
virtual int withB(B index) { return -2; }
};
struct Child : public Parent
{
private:
virtual int withB(B index) override { return -3; }
};
int main()
{
return Child()[A()];
}
这种方法,也称为 Non-Virtual Interface Idiom,代表了基础 class 的客户端和派生 classes 的实现者之间关注点的良好分离。它还作为副作用解决了您的编译问题。
我有一个关于 C++ 中的下标运算符、重载和继承的问题。 我很确定,如果您的父 class 具有多个函数重载,则子项可以仅覆盖其中一个函数并继承其余函数。这似乎不适用于下标运算符。(我做了一个错误的假设。它实际上与任何其他函数没有什么不同。)考虑以下代码:
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); }
};
由于我可能从父级继承了很多地方,并且必须手动指定这样的功能不利于维护。谢谢你的想法。
在 C++ 中避免两件事:
- 混合重载和覆盖。
- Public 虚函数(如果不是析构函数)。
保持你的基础-class 重载运算符是非虚的,并让它们委托给具有不同名称的私有虚函数。
这是一个例子:
struct A {};
struct B {};
struct Parent
{
virtual ~Parent() {}
int operator[](A index) { return withA(index); }
int operator[](B index) { return withB(index); }
private:
virtual int withA(A index) { return -1; }
virtual int withB(B index) { return -2; }
};
struct Child : public Parent
{
private:
virtual int withB(B index) override { return -3; }
};
int main()
{
return Child()[A()];
}
这种方法,也称为 Non-Virtual Interface Idiom,代表了基础 class 的客户端和派生 classes 的实现者之间关注点的良好分离。它还作为副作用解决了您的编译问题。