C++运算符继承和重载

C++ operator inheritance and overloading

本文关键字:重载 继承 运算符 C++      更新时间:2023-10-16

我有一个基类a和一个派生类B。a和B都定义[]运算符,但参数类型不同。尽管如此,当我尝试在带有A的B类型对象上使用[]运算符时,C++找不到A对此的定义。很烦人。规则是什么?

类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
}