我有幾個共享公共基類的類,但它們的方法工作方式不同。所以在下面的例子中,除了執行計算的方式之外,Adder和Multiplier是相同的。將對象從一個派生類更改爲另一個派生類
有沒有辦法來改變「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;
}
嘗試將一個派生對象轉換爲另一個派生對象的想法很好地表明您的設計需要重新審視。 –
偏離主題,但我總是被告知,如果在C++中不需要它,則不應該使用「this」。但這只是我猜想的慣例問題。 –
我認爲這是一個抽象的例子,但除非你有會員資料,爲什麼還要打擾呢?當需要我想象時,簡單地創建一個新的「乘數」就更加透明。在你開始投射的那一刻,你爲自己和其他需要與你的代碼進行交互的人制造更復雜的事情 – sji