は、それが派生クラスで、彼らが過負荷にせずに、派生型を返すような基本型を返す基底クラスの関数を定式化するためにC++で可能ですか?継承機能ではなく、基本クラス
最小例:
class Base
{
public:
Base(double v)
{
value = v;
}
Base add(Base b)
{
return Base(b.value + this->value);
}
void print()
{
std::cout << value << std::endl;
}
double value;
};
class Derived : public Base
{
public:
Derived(double v) : Base(v)
{
}
void timesTwo()
{
value *= 2.0;
}
};
int main()
{
Derived d1(1), d2(2);
// This doesn't work because the result is of type Base
(d1.add(d2)).timesTwo();
return 0;
}
動機
実際の例では、Base
は線形代数行列を表し、Derived
はベクトルを表します。行列はスカラーによる加算や乗算など、ベクトルに適用可能な多くの関数を提供します。この場合
、それはベクトルを返すために、手動でこれらのすべての行列関数をオーバーライドする必要がないことが望ましいであろう。可能であれば、this
タイプが何であれ、戻りタイプはそれと同じでなければならないことを表現したいと思います。
例:
class Matrix
{
...
Matrix operator*(double x);
};
class Vector : Matrix
{
...
};
Matrix M;
M = M * 2.0; // works
Vector v;
v = v * 2.0; // does not work, because v * 2.0 returns a Matrix
例えばオーバーライドするための努力すべての派生クラスのoperator*()
はVector2
、Iは、溶液はMatrix
からVector
に(及びVector3
にキャストを定義することであることを理解するなど、3-ための派生クラスと2次元ベクトルが存在するという事実によって
を増加させます、...)しかし、これはすべてのエントリー(効率のために、スタック配列です)をコピーすることを伴います。
もっと効率的なソリューションはありますか?そして、いない場合、それは一般的に
- に、より良い/クリーナーと見なされる各派生クラスで、またはキャストを定義
- に関連するすべてのコードを複製?私の現在の理解で
は、競合の問題は、次のとおりです。
- 重複したコードは、ソリューションエラーが発生しやすいとリファクタリングがより困難になります。
- 既存のコードを再利用するには、「スコープ」がMatrix、Vector、Vector3、...の間で変更されるたびに多くのコピー操作が必要です。大きな計算で使用すると効率が悪くなります。
任意の提案が最もいただければ幸いです。ありがとう!
[CRTP](https://en.m.wikipedia.org/wiki/Curiously_recurring_template_pattern)を見てください:また、あなたが派生クラスで必要なメソッドが純粋仮想宣言する。 – Holt
私はそれがアンチパターンになると思います。 – szpanczyk
代わりに操作を仮想にすることができるので、多態性だけを使用できます。しかし、それは最初にJavaやC#を使うことを示唆しています。 – Incomputable