gpt4 book ai didi

c++ - 运算符重载时的继承和 "invalid covariant return type"错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:18 24 4
gpt4 key购买 nike

我有以下表示数值数组的类

class Array {

protected :
double *data; // this will hold the data of the array
int n; // number of elements in the array

public :
virtual Array operator+ ( double value ) const {
// return a new array with the argument added to each element
}

// other declarations follow here...
};

另一个类继承了前一个类并为每个元素添加了一个 bool 掩码

class MaskedArray : public Array {

private :
bool *mask; // this holds the boolean mask of the array

public :
MaskedArray operator+ ( double value ) const {
// return a new MaskedArray with the argument added to each element
}

// other declarations follow here...
}

当我尝试编译时出现错误“无效的协变返回类型”,这是正常的,因为两个类中的两个重载运算符具有相同的签名。

我能够通过引用而不是值传递继承类的重载运算符的参数来规避这个问题,因为这会更改函数的签名,同时为两个类保留相同的接口(interface)。但是我觉得这不是很干净,如果我想继承 MaskedArray 怎么办?我会面临同样的问题。

我希望能够在我的客户端代码中编写这样的东西

Array array;
// populate array here
Array array2 = array + 1.0;

MaskedArray maskedArray;
// populate maskedArray here
MaskedArray maskedArray2 = maskedArray + 1.0

有没有比我的“hack”更优雅的方式来实现这一点?

最佳答案

Covariant 表示重写虚函数的返回类型继承自基类函数的返回类型。

但是:虽然 C++ 通常支持协变,但标准仅在返回指针或引用时才允许协变。 operator+ 按值返回,这就是您得到编译器错误的原因。这并非特定于运算符,而是适用于每个函数。

删除 virtual 关键字将消除编译器错误。但如果这样做,请记住将 operator+ 应用于 Array 引用或指针,实际上引用 MaskedArray 返回 Array(因此不包含 mask 成员。如果将其转换为 MaskedArray,则原始 mask 将丢失)。

关于c++ - 运算符重载时的继承和 "invalid covariant return type"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7579371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com