2013-04-05 49 views
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,但保持基類完好無損。什麼是最好的方式來做到這一點?

(有幾個派生類,基類提供了所有通用接口,一些派生類將在稍後添加而不修改基類)。

+0

所以你想*移動基礎對象? – 2013-04-05 21:07:26

+0

是的,我想移動它,但是我需要銷燬一個孩子並使用基礎對象創建另一個孩子 – 2013-04-05 21:08:14

+1

不要使用繼承,而是使用組合!你將一個指針移動到基類實現的周圍,它不會被破壞(因爲你保留了一個引用計數器)。 – 2013-04-05 21:10:10

回答

0

您不能銷燬派生類保留基類,因爲它是相同的實例。 我們可以使用如下因素代碼

#include <iostream> 

using namespace std; 

class Data {}; 
class base 
{ 
public: 
    base() 
    { 
     printf("base pointer = %08X\n", this); 
    } 
}; 

class derrived1 : public base 
{ 
public: 
    derrived1() 
    { 
     printf("derrived1 pointer = %08X\n", this); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    base* object = new derrived1(); 
    delete object; 
    return 0; 
} 

輸出將顯示基地derived1是你使用一些棘手的代碼來實現你想要的另一方面相同的指針 證明這一點。 的想法是使用指向Data類的指針而不是變量。 你的代碼會變得那麼作爲如下因素

#include <iostream> 

using namespace std; 

class Data {}; 
class base 
{ 
public: 
    base(){data = new Data} 
    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; 
} 

我希望這會有所幫助。