Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将基类数据从一个派生类复制到另一个派生类_C++_Inheritance_Casting - Fatal编程技术网

C++ 将基类数据从一个派生类复制到另一个派生类

C++ 将基类数据从一个派生类复制到另一个派生类,c++,inheritance,casting,C++,Inheritance,Casting,假设我有三个班: typedef struct base { float A; float B; ... base() : A(1.0f), B(1.0f) {} } base; class derived1 : base { int C; int D; }; class derived2 : base { int E; int F; }; 我想将基类数据从一个派生类对象复制到另一个派生类对象。 只复制A、B等的基类值是否安全

假设我有三个班:

typedef struct base
{
    float A;
    float B;
    ...
    base() : A(1.0f), B(1.0f) {}
} base;

class derived1 : base
{
    int C;
    int D;
};

class derived2 : base
{
    int E;
    int F;
};
我想将基类数据从一个派生类对象复制到另一个派生类对象。
只复制A、B等的基类值是否安全。。。从一个物体到另一个物体

derived1* object1 = new derived1;
derived2* object2 = new derived2;

void make_object1()
{
    object1->C = 2;
    object1->D = 3;
}

void make_object2()
}
    object2->A = 4;
    object2->B = 5;
    object2->E = 6;
    object2->F = 7;
}

void transfer_base()
{
    *((base*)object1) = *((base*)object2);
}
假设我的程序需要经常执行这种操作,有没有更好(更快的代码)的方法来实现这一点? 我这样做的原因是我已经编写了一个模拟和图形渲染器。我希望尽可能高效地使用仅从模拟中的对象中选择的数据更新图形显示对象。模拟是非常CPU密集型的。。。 到目前为止,这种方法似乎是有效的,但我担心可能有一些我忽略了…

代码

*((base*)object1) = *((base*)object2);
这是非常不安全的,因为C样式转换可以做任何事情。比如重新解释,或者抛弃陈词滥调

相反,如果您想调用
base::operator=
,则显式地调用它。开脱=好,隐含=坏


这仍然不是“安全的”,因为切片可能会破坏派生类的类不变量。任何试图弄清楚这段代码中发生了什么的人都可能会对基类子对象中值的突然变化感到惊讶,并浪费大量时间试图确定这些值来自何处。但至少它没有C样式转换那么糟糕。

相反,为什么不在基类中创建自己的赋值方法(删除不必要的C工件typedeffing):

那你就说

der1.assign_base(der2);

我可以问一下,你的手柄“干杯和hth.-Alf”是什么意思吗?@SebbyJohanns:你现在可以看看你,如果我知道要寻找什么,我真的会。现在我看到“hth”是一个结束语,谢谢。编译器已经生成了这个方法,名称为
operator=
struct base
{
    float A;
    float B;
    ...
    base() : A(1.0f), B(1.0f) {}
    base& assign_base(const base& right) { A = right.A; B = right.B; }
};
der1.assign_base(der2);