2011-02-06 110 views
2

我想知道如何在C++中做些什麼。我希望能夠創建此結構的實例將C++轉換爲派生結構和父結構

struct ComplexInstruction : simple_instr 
{ 
    bool isHead; 
    bool isTail; 
}; 

它複製了來自simple_instr實例的所有數據。所以基本上,我想要做這樣的事情

ComplexInstruction cInstr = instr; // <- instance of simple_instr 

,並有cInstr在INSTR所有數據的副本,而無需在各個領域複製(因爲有很多他們的)。我不知道如何做到這一點,我不認爲簡單的鑄造工作。另外,是否有可能做相反的事情?即有一個ComplexInstruction的實例並將其轉換爲simple_instr的一個實例。我認爲這可以使用鑄造完成,但我不;噸有與C++

由於經歷了很多提前

回答

7

在派生類中創建一個構造器,以從基類中進行初始化。

class Base 
{ 
    int x; 
public: 
    Base(int a) : x(a){} 
}; 

class Derived : public Base 
{ 
public: 
    Derived(const Base & B) : Base(B){} 
}; 

需要注意的是,如果你有基本的派生類對象,你實際上有一個基本對象,你可以放心地使用基本拷貝構造函數,像這樣。

Derived d; 
Base b(d);//the parts of Base that are in Derived are now copied from d to b. 
      //Rest is ignored. 

如果您想更詳細的,你寫了一個運營商=在派生類中像

void operator=(const Base & b) 
{ 
    Base::operator=(b); 
    //don't forget to initialize the rest of the derived members after this, though. 
} 

這一切都取決於你想要做什麼,真的。重要的是:明確。不要讓你的班級沒有初始化的成員。

0

編輯:這是不是爲了實現這一目標的最佳方式,請看其他答案。


這將做你正在尋找。

struct ComplexInstruction : simple_instr 
{ 
    ComplexInstruction(const simple_instr &simple) 
    { 
     *((simple_instr*)this) = simple; 
    } 

    bool isHead; 
    bool isTail; 
}; 

然後ComplexInstruciton complex = simple;將調用轉換構造函數。 ComplexInstruction的複製構造將this轉換爲其基類,並且=將調用simple_instr's複製構造函數,默認情況下它是按位副本。

+1

這很有趣,因爲我只是偶然嘗試過,給了我一個堆棧溢出異常:) – Marlon 2011-02-06 20:51:50

+0

Doh!當然,我們將* this = simple調用複製構造函數。 – shf301 2011-02-06 20:55:54

3

您需要提供一個構造函數的參數是轉換爲const simple_instr&

struct simple_instr { 
    int i; 
    simple_instr(): i(0) { } 
    explicit simple_instr(int i): i(i) { } 
}; 

struct ComplexInstruction: simple_instr { 
    explicit ComplexInstruction(const simple_instr& simple): 
    simple_instr(simple), isHead(false), isTail(false) { } 
    bool isHead; 
    bool isTail; 
}; 

int main() { 
    simple_instr instr; 
    ComplexInstruction cInstr(instr); 
} 

在這裏,我選擇了一個明確的構造,但根據語義,一個隱含的一個也可能是合適的。只有構造函數是隱式的,=式初始化才能工作,不需要強制轉換。