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

标签 c++ inheritance casting

假设我有三个类(class):

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=,则显式调用。显式=好,隐式=坏。

即,

object1->base::operator=( *object2 );

这仍然不“安全”,因为切片可能会破坏派生类的类不变量。任何试图了解此代码中发生的情况的人可能会对基类子对象中值的突然变化感到惊讶,并浪费大量时间来尝试确定这些值来自何处。但至少没有 C 风格选角那么糟糕。

关于c++ - 将基类数据从一个派生类复制到另一个派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15672207/

相关文章:

c++多态性和传递子类

java - 推荐通过接口(interface)声明常量

python - PyQt4 添加从另一个自定义小部件派生的自定义小部件到布局

C# Enum 需要三元转换吗?

c - 错误 "expression must have pointer type"何时发生?

C++ 类的 vector ,不能在所述类的构造函数内进行push_back

c++ - 运算符无故更改类的参数 (*int)

c++ - stdio.h 和 iostream 之间有什么区别?

c++ - 如何向列表添加值<shared_ptr<Abstract>>

C++ 非 const 到 const 转换编译错误