如何在向方法传递超类时防止自动下转换
How to prevent automatic downcasting when passing a superclass to/from a method
我有几个从顶级超类派生的类:
base:CDeviceClientRequest子类:CDeviceSetEnabledRequest(基本)inst类:CDeviceGPSSetEnabledRequest*(子类)inst类:CDeviceTotalStationSetEnabledRequest*(子类)
只有那些用*标记的构造函数是可实例化的,其他的都有受保护的构造函数,即构造函数调用基类构造函数,设置私有成员变量。
我正在通过一种方法构建它们:
CDeviceClientRequest getRequest(int type)
{
switch (type)
{
GPS_SET_ENABLED: return CDeviceGPSSetEnabledRequest();
TS_SET_ENABLED : return CDeviceTotalStationSetEnabledRequest();
default:
// raise an unknown type exception
}
}
然后我有一些调用请求的代码:
void invoke(CDeviceClientRequest& request)
{
// some code
}
所以我有这样的代码:
CDeviceClientRequest request = getRequest(GPS_SET_ENABLED);
invoke(request);
我的问题是,尽管我正在调用CDeviceGPSSetEnabledRequest()的构造函数,从getRequest()返回的是CDeviceClientRequest,以及传递给调用的内容也是CDeviceClientRequest,而不是像我预期的那样是CDeviceGPSSetEnabledRequest。
我通过向std::cout的所有超级和基类添加一个简单的whatAmI()方法来验证这一点类的名称,并且我只得到"I are a CDeviceClientRequest"。某个地方的事实它正在处理一个派生类。
非常感谢您的帮助。(注意:我已经大大简化了帖子的代码)。
问题是对象切片:当您按值返回时,您会返回该类型的实例,即使它是从派生类型实例化的:
CDeviceClientRequest getRequest(int type);
这只能返回类型为CDeviceClientRequest
的对象。您可以通过返回一个指向基类型的智能指针来解决此问题。
std::unique_ptr<CDeviceClientRequest> getRequest(int type)
{
switch (type)
{
GPS_SET_ENABLED:
return std::unique_ptr<CDeviceClientRequest>(new CDeviceGPSSetEnabledRequest);
TS_SET_ENABLED :
return std::unique_ptr<CDeviceClientRequest>(new CDeviceTotalStationSetEnabledRequest);
default:
// raise an unknown type exception
}
}
相关文章:
- 模板转换为超类
- 我的超类中的模板问题与结构定义
- 如何将AVFrame转换为类
- 无法<string>从"常量字符 []"转换为<类名>
- 创建子类的多个实例,其中只有一个超类实例
- 给定一个指向对象的超类指针,如何获取对象的大小?
- 从从该抽象类派生的 Python 对象强制转换C++抽象类C++
- 重写另一个方法 [C++] 使用的超类回调函数
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 将 void* 强制转换为多个继承类的超类不会调用正确的方法
- 无法将超类强制转换为子类
- 将子类列表转换为超类列表
- 向上转换到超类或接口
- 关于在强制转换为子类的超类时调用其重写方法
- 在 c++ 中将多维数组强制转换为其超类的多维数组
- 将 std::unique_ptr 转换为 std::unique_ptr 转换为超类的正确方法是什么?
- 当对象不是动态分配的(不是指针)时,是否可以从超类对象转换到子类
- 如何在向方法传递超类时防止自动下转换
- 在没有数据重复的情况下强制转换/实例化/转换为子类/超类
- 为什么我不能将超类引用强制转换为同时扩展另一个超类的子类?