Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;运算符继承和重载_C++ - Fatal编程技术网

C++ C++;运算符继承和重载

C++ C++;运算符继承和重载,c++,C++,我有一个基类a和一个派生类B。a和B都定义了[]运算符,但参数类型不同。不过,当我试图使用[AR] C++的一个对象的[b]对象时,找不到这个的DEF。很烦人。规则是什么?类B中的运算符隐藏类A中的运算符。这是派生类中定义的任何方法重载超类中的方法的问题。如果名称查找在B中找到名称匹配项,则不会在a中查找,即使在B中找到的匹配项无法调用 您需要将其纳入B的范围: class X{}; class Y{}; class A { public: auto operator[](X) {};

我有一个基类a和一个派生类B。a和B都定义了[]运算符,但参数类型不同。不过,当我试图使用[AR] C++的一个对象的[b]对象时,找不到这个的DEF。很烦人。规则是什么?

类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
}
类X{};
类Y{};
甲级{
公众:
自动运算符[](X){};
};
B类:公共A{
公众:

使用::运算符[];//您能演示如何使用在中使用的代码吗?您的意思是要调用A的运算符[]这是个问题:提出一个干净的版本,让你检查。如果你不知道任何规则禁止我尝试做的事情,我可能不得不这么做。“Tungkyunkyy,是的,我就是这么想的。谢谢,这就是我想知道的。但是我不明白为什么C++会像这样。如果它找不到操作数。在类B中匹配它应该在A中匹配。当然!这就是继承的全部意义。@Henrik-不,这会导致神秘的bug。假设您编写了一个从库类派生的类,并且您的类有一个成员函数
void foo(double);
。您可以使用类型为
int
的参数调用它,并且该参数将转换为
double
,以便进行调用。现在假设库的维护版本向该基类添加了一个成员函数,
void foo(int);
。现在你的代码会悄悄地调用基类版本而不是你的版本。@Pete,我不同意。如果第三方提供了库类,它应该发布带有文档的接口,并且它必须保持固定。所做的任何更改都只会影响隐藏的代码,而不会影响用户界面或功能。向后兼容性是最重要的。这就是行业标准变化如此缓慢的原因。