C ++转换为派生和父结构

时间:2011-02-06 20:43:32

标签: c++ casting

我想知道如何用C ++做点什么。我希望能够创建此结构的实例

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

复制simple_instr实例中的所有数据。基本上,我想做这样的事情

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

并让cInstr拥有instr中所有数据的副本,而不必复制每个字段(因为它们有很多)。我不知道这是怎么做的,我不认为简单的铸造会起作用。另外,可以反过来吗?即有一个ComplexInstruction实例,并将其转换为simple_instr的实例。我认为这可以通过演员来完成,但我没有很多c ++经验

提前致谢

3 个答案:

答案 0 :(得分:8)

在派生类中创建一个构造函数以从基类初始化。

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

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

请注意,如果您有一个Base的派生对象,那么您实际上有一个基础对象,您可以安全地使用基本副本ctor。

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

如果你想要更详细,你可以在派生类中编写一个operator =,如

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

这完全取决于你想做什么,真的。重要的是:明确。不要让未经初步的成员离开。

答案 1 :(得分: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);
}

这里我选择了一个显式构造函数,但是根据语义,隐式构造函数也可能是合适的。只有构造函数是隐式的,= - 样式初始化才能在不进行转换的情况下工作。

答案 2 :(得分: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复制构造函数,默认情况下是一个按位复制。