3
我有幾個子類都具有相同的父級。每個子類都可以使用父對象中包含的一些數據構造。我想使用包含在基礎對象中的信息(無需修改基礎對象)將一個孩子轉換爲另一個孩子。在不更改基類的情況下將另一個類指派給另一個類
#include <iostream>
using namespace std;
class Data {};
class base
{
public:
base() {}
base(Data input) : data(input) {}
virtual ~base() { cout << "Deleting :" << this->name() << endl; }
template<class T> static base* CastToDerrived(base* object)
{
T* output = new T(object->data);
delete object;
return output;
}
virtual const char* name() {return "base";}
Data data;
};
class derrived1 : public base
{
public:
derrived1() {}
derrived1(Data input): base(input){}
~derrived1(){cout << "Deleting :" << this->name() << endl;}
const char* name(){return "derrived1";}
};
class derrived2 : public base
{
public:
derrived2(){}
derrived2(Data input): base(input){}
~derrived2(){cout << "Deleting :\t" << this->name() << endl;}
const char* name(){return "derrived2";}
};
int main(int argc, char *argv[])
{
base* object = new derrived1();
cout << "Created :\t"<<object->name()<<endl;
object = base::CastToDerrived<derrived2>(object);
cout << "Casted to :\t"<<object->name()<<endl;
}
,其輸出:
目前如在下面的例子中示出,其被實施
Created : derrived1
Deleting :derrived1
Deleting :base
Casted to : derrived2
然而,這需要基類到被破壞和再次產生,這是我想避免 - 我想摧毀derrived1,使用base來構建derrived2,但保持基類完好無損。什麼是最好的方式來做到這一點?
(有幾個派生類,基類提供了所有通用接口,一些派生類將在稍後添加而不修改基類)。
所以你想*移動基礎對象? – 2013-04-05 21:07:26
是的,我想移動它,但是我需要銷燬一個孩子並使用基礎對象創建另一個孩子 – 2013-04-05 21:08:14
不要使用繼承,而是使用組合!你將一個指針移動到基類實現的周圍,它不會被破壞(因爲你保留了一個引用計數器)。 – 2013-04-05 21:10:10