メソッドの動作方法が異なることを除いて、共通の基本クラスを共有するクラスがいくつかあります。したがって、以下の例では、加算器と乗算器は、計算の実行方法を除いて同じです。
その場で「a」を乗数に変更する方法はありますか? 派生クラスを相互に変換するメソッドを実装する必要がありますか? たとえば、次のようなもの
a = a.asMultiplier()
?
以下のコードでわかるように、乗算器に reinterpret_cast を試みましたが、うまくいきませんでした。それでも、加算器のように動作します。(gcc OS X v4.2.1)
#include <iostream>
class Base {
protected:
int a,b;
public:
Base(int a, int b) {
this->a = a;
this->b = b;
}
virtual ~Base() { }
virtual int calculate() = 0;
};
class Adder : public Base {
public:
Adder(int a, int b) : Base(a, b) {
}
int calculate() {
return this->a + this->b;
}
};
class Multiplier : public Base {
public:
Multiplier(int a, int b) : Base(a, b) {
}
int calculate() {
return this->a * this->b;
}
};
int main() {
Base* a = new Adder(3,4);
Base* m = new Multiplier(3,4);
std::cout << "Adder gives " << a->calculate() << std::endl;
std::cout << "Multiplier gives " << m->calculate() << std::endl;
a = reinterpret_cast<Multiplier*>(a);
std::cout << "Now adder gives " << a->calculate() << std::endl;
delete a;
delete m;
return 0;
}