基本クラスとそこから派生した 2 つのクラスがあるとします。
class Base
{
protected:
double value;
public:
virtual ~Base();
Base(double value) : value(value) {}
Base(const Base& B) { value=B.value; }
Base operator+ (const Base& B) const {
return Base(value+B.value);
}
};
class final Derived1 : public Base {
public:
Derived1(double value) : Base(value) {}
};
class final Derived2 : public Base {
public:
Derived2(double value) : Base(value) {}
};
私は次のことを達成したい:
int main(int argc, char *argv[])
{
Derived1 a = Derived1(4.0);
Derived2 b = Derived2(3.0);
a+a; // this should return a Derived1 object
b+b; // this should return a Derived2 object
a+b; // this should FAIL AT COMPILE TIME
return 0;
}
つまり、継承されたオブジェクトが呼び出し元のインスタンスと同じ型のoperator+
オブジェクトに対してのみ動作することを保証したいと考えています。
これをきれいにするにはどうすればよいですか?クラスごとに演算子を再定義していることに気付きました。
class final Derived1 : public Base {
...
Derived1 operator+ (const Derived1& D1) const {
return Derived1(value+D1.value);
}
...
};
class final Derived2 : public Base {
...
Derived2 operator+ (const Derived2& D1) const {
return Derived2(value+D1.value);
}
...
};
しかし、それはただの痛みです。さらに、適切なコードの再利用のようには思えません。
ここで使用する適切なテクニックは何ですか?