2017-05-02 94 views
0

我想知道是否有一種方法來編程C++中的類轉換我不是在談論任何形式的type_casting,而是一個實例的克隆和轉換到另一個。C++將類的實例轉換爲另一個

如果我有這樣的代碼:

class BaseClass 
{ 
    string baseData; 
}; 

class DerivedClassB : public BaseClass 
{ 
    int intData; 
}; 

class DerivedClassA : public BaseClass 
{ 
    float floatData; 
}; 

可以說,我有DerivedClassA的一個實例,我想「轉換」該實例DerivedClassB甚至BaseClass的我不關心的損失'floatData',只要BaseClass的'baseData'保留

我可以實現從任何類型到任何類型的轉換嗎?

BaseClass -> DerivedClassA 
DerivedClassA -> DerivedClassB 
DerivedClassB -> BaseClass 

我將如何實現這種功能?

非常感謝啓蒙。

+1

我認爲這是你在找什麼http://en.cppreference.com/w/cpp/language/cast_operator –

+0

首先是一個動態轉換,並可能會失敗,如果對象不是一個實例DerivedClassA'。第二種是類型轉換,您應該創建一個構造函數或類型轉換運算符。第三種是靜態轉換,因爲DerivedClassB的所有實例都是由'BaseClass'定義的實例。你需要一個關於C++中的「繼承」和「類型轉換運算符」的教程。 Stackoverflow不是這樣廣泛的問題的地方。 – Persixty

+0

雖然人們不明白我真正問的問題...我知道type_cast和繼承,我說的是這樣的真正轉換: BaseClass * baseC = new BaseClass(); DerivedClassA * derA = new DerivedClassA(baseC); DereivedClassB * derB = new DerivedClassB(derA); BaseClass * baseC2 = new BaseClass(DerB); 以更時尚的方式。 – scimunk

回答

1

我可以實現從任何類型到任何類型的轉換嗎?

嗯,是的,這就是reinterpret_cast對不對? 你最有可能發生未定義行爲,如果你打破strict aliasing rules


我會如何實現這種functionnality?

對於您的使用案例,您可能只需提供一個Converting Constructor

//Forward declaration 
class BaseClass; 
class DerivedClassB; 
class DerivedClassA; 

class BaseClass 
{ 
    //Converting constructor: DerivedClassB -> BaseClass 
    BaseClass(const DerivedClassB&); 

    BaseClass() = default; 
    string baseData; 
}; 

class DerivedClassB : public BaseClass 
{ 
    //Converting constructor: DerivedClassA -> DerivedClassB 
    DerivedClassB(const DerivedClassA&); 

    DerivedClassB() = default; 
    int intData; 
}; 

class DerivedClassA : public BaseClass 
{ 
    //Converting constructor: BaseClass -> DerivedClassA 
    DerivedClassA(const BaseClass&); 

    DerivedClassA() = default; 
    float floatData; 
}; 

// -------------------------- 

//Implement them out of class 
+0

謝謝你,這更接近我正在尋找的東西,但是如果我有一百個子類,並且如果我想能夠將它們轉換爲任何其他子類,不管它是什麼?創建一個構造函數爲每個變得不切實際。請注意,只要我可以將數據保留在BaseClass中,我不關心子類中的數據丟失情況。 – scimunk

+0

@epixerion首先將它們轉換爲超類,然後將它們轉換爲新的子類,如何?每個只需要一個構造函數或者演員操作符。這就是說,這顯然是代碼味道。你能給我們你的背景嗎?你可以改爲不使用繼承,使包含相關數據的前一個超類只是一個成員,然後像'OldClass old_object; NewClass new_object(old_object.get_former_super_class())'?會更乾淨。 – Aziuth

+0

我會嘗試給出一個上下文:我試圖做一個節點編輯器,每個節點是一個名爲'Node'的baseClass的實例,並且我有一個名爲'Graph'(它的子類'Node')的特殊節點,它包含一定數量的節點,現在我有不同類型的圖:'Symmetry,ForEach,For,Etc'等所有的子類'Graph'和影響節點裏面的不同,如果用戶想改變圖的類型,我只是需要做的就是將該類轉換爲目標圖,我需要的只是'Graph'類中包含的數據,'Symmetry,ForEach,For'子類中的數據現在是obselette。 – scimunk

相關問題