我正在寻找有关如何继续使用C ++构建的类层次结构的建议。
基类是Matrix:
class Matrix
{
protected:
int rows;
int columns;
double* values;
public:
\\lots of stuff goes here. bla di bla di bla.
virtual Matrix operator+(const Matrix& addend) const;
\\etc.
}
Squarematrix继承自Matrix
class Squarematrix : public Matrix
{
public:
Squarematrix operator+(const Squarematrix& addend) const;
}
Operator +分别返回矩阵或squarematrix。因为operator +是一个虚函数,所以不会编译,因为它必须在所有类中都有相同的返回类型。
那么我的选择是什么?
我可以使用普通函数而不是虚函数。这有点烦人,但在大多数情况下都不会引起问题。
我可以在所有情况下返回矩阵。这基本上会使我的squarematrix类在***中使用正确的痛苦,因为我必须不断地从矩阵转向squarematrix。
我可以返回对squarematrix的引用。然后矩阵必须存储在堆上,并且无法确保将其安全删除。特别是如果我做这样的事情:
squarematrix a=b+(c+d);
(c + d)将存储在堆上,并且没有指针,因此会泄露。
有没有办法保留虚函数并且仍然有不同的返回类型?
在这种情况下你会提出什么建议?
感谢您的帮助。期待收到你的回复。
答案 0 :(得分:6)
我建议:
Squarematrix
。Matrix
添加构造函数以构造方阵。Matrix
中添加成员函数来回答该查询。class Matrix
{
public:
Matrix(int r); // Construct a square matrix.
Matrix(int r, int c); // Construct a rectangular matrix.
bool isSquareMatrix() const { return (rows == columns); }
Matrix operator+(const Matrix& addend) const;
private:
int rows;
int columns;
double* values;
}
答案 1 :(得分:1)
这称为返回类型协方差(https://en.wikipedia.org/wiki/Covariant_return_type)。
旧的编译器不支持它,但现在很多人都支持它。例如,我的代码在Visual Studio 2017中编译得很好。这是一篇关于它在c ++中的使用和限制的文章:https://aycchen.wordpress.com/2009/08/17/covariant-return-type-in-cpp/。
C#尚不支持,但正在考虑将来的版本。请参阅https://github.com/dotnet/csharplang/issues/49。
新版本的Java也支持它。请参阅https://blogs.oracle.com/sundararajan/covariant-return-types-in-java。
除了实现问题之外,据我所知,没有理由不将它添加到多态语言中。我不相信它会导致错误,尽管由于Java中的不完美实现会导致错误 - 请参阅https://dzone.com/articles/covariant-return-type-abyssal。