将基类数据从一个派生类复制到另一个派生类
copy base class data from one derived class to another
假设我有三个类:
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风格强制转换几乎可以做任何事情。比如重新解释,或者抛弃constness。
相反,如果您想调用base::operator=
,那么显式地调用。显式=好,隐式=坏。
。
object1->base::operator=( *object2 );
这仍然是不安全的,因为切片可能会破坏派生类的类不变量。任何试图了解这段代码中发生的事情的人都可能会对基类子对象中值的突然变化感到惊讶,并浪费大量时间试图确定这些值来自何处。但至少它不像C风格的强制转换那么糟糕。
相反,为什么不在基类中创建您自己的赋值方法(删除不必要的C-artifact类型定义):
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);
相关文章:
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 如何将一个变量用于父类和派生类
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 用于从一个基派生的类的GDB漂亮的打印机
- 存储在一个通用容器中的派生对象.如何避免铸造
- C++多态性:如何测试一个类是否派生自另一个基类
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 如果我们有一个基*类,如何访问派生模板类的成员函数
- 无法从派生类型的作用域访问另一个实例的受保护成员
- C 有一个关键字,允许从派生类引用基本类型
- 从一个函数和某些类型指定符定义整个派生类的宏
- 是否有可能有一个派生类继承最终函数但创建相同的函数(而不是重写)
- 在C++中从模板类本身派生一个模板类
- 在c++中基于另一个变量类型派生一个变量类型