私はこのクラス階層をどのように進めるのかアドバイスを探しています。私はC++で構築しています。C++の関数から継承したクラスを返す最も良い方法
基本クラスは行列である:
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マトリックス
class Squarematrix : public Matrix
{
public:
Squarematrix operator+(const Squarematrix& addend) const;
}
オペレーター+から継承され、それぞれマトリックスまたはsquarematrixを返します。 operator +は仮想関数なので、すべてのクラスで同じ戻り値の型を持たなければならないため、このコンパイルは実行されません。
私のオプションは何ですか?
私は仮想ではなく普通の関数を使うことができました。これは少し面倒ですが、ほとんどの状況で問題を引き起こすことはありません。
すべての場合に行列を返すことができます。これは基本的に私のsquarematrixクラスを、使用する***の右の痛みにするでしょう。私はmatrixからsquarematrixへと絶えずダウンキャストする必要があります。
私は正方行列への参照を返すことができます。その後、マトリックスはヒープ上に格納されなければならず、安全に削除されることを確実にする方法はありません。私はこのような何かあれば特に:
squarematrix a=b+(c+d);
を
(C + D)は、ヒープ上に格納され、漏洩したことになるので、それへのポインタを持っていません。
仮想関数を保持する方法はありますか?また、戻り値の型は変わりませんか?
あなたはこの状況で何をアドバイスしますか?
ありがとうございました。あなたからの返信を楽しみにしています。
いいえ。オーバーライドされた仮想関数は、同じ型を返す必要があります。物語の終わり。この非常に一般的なデザインパターンでは、仮想関数はスマートポインタを基本クラスに返します。クラスが正しく設計されている場合、これはかなりうまく機能します。 –
@SamVarshavchik必ずしもそうではありません。 'clone()'メンバ関数のように、共変な戻り値型を持つのは一般的です。 – juanchopanza
[Circle-ellipse_problem](https://en.wikipedia.org/wiki/Circle-ellipse_problem)をご覧ください。 – Jarod42