2011-02-06 74 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); 
} 

在这里,我选择了一个明确的构造,但根据语义,一个隐含的一个也可能是合适的。只有构造函数是隐式的,=式初始化才能工作,不需要强制转换。