如何在不修改基类且不逐个复制的前提下复制基类对象值到派生类?
安全复制CClient对象到CClientHook的方法
方法1:利用public继承的基类赋值
因为CClientHook是CClient的public派生类,我们可以直接对g_ClientHook的基类子对象进行赋值,编译器会自动调用CClient的默认赋值运算符完成所有成员的复制:
static_cast<CClient&>(g_ClientHook) = g_Client;
安全性说明
CClient的默认赋值运算符会自动复制所有非静态成员(包括Connect、Disconnect函数指针和m_bIsConnected布尔值),无需手动逐个指定成员。- 函数指针的复制是浅拷贝,这里不存在资源管理问题,完全安全;布尔值的复制也没有风险。
- 该操作仅修改
g_ClientHook的基类部分,不会影响派生类独有的m_bIsHooked成员。
方法2:使用memcpy内存拷贝
由于CClient是POD类型(所有成员均为POD,无用户定义的构造/析构/赋值运算符,无虚函数),可以直接通过memcpy复制其内存内容到g_ClientHook的基类区域:
#include <cstring> // 需要包含头文件 memcpy(&g_ClientHook, &g_Client, sizeof(CClient));
安全性说明
sizeof(CClient)确保仅复制基类部分的内存,不会覆盖g_ClientHook中派生类独有的m_bIsHooked成员。- POD类型的内存布局是标准且可预测的,
memcpy操作不会导致内存错误或未定义行为。 - 同样无需手动逐个复制成员,也不需要修改
CClient基类。
内容的提问来源于stack exchange,提问作者fajront
相关产品推荐
相关产品推荐

