【发布时间】:2022-11-21 17:49:03
【问题描述】:
我有一个基类设备和继承类输入设备.在 XYZ 类中,我有一个函数XYZ::setDevice(int num, 设备设备)期望对象 Device 作为参数。当我使用作为 Device (InputDevice) 子类的参数调用函数 setDevice() 时,它被转换为 Device,之后我无法访问派生类的派生函数。 因此,如果我想在函数 setDevice() 中调用“设备”的函数,它会调用 Device 函数而不是类 InputDevice 中的重写函数。 我究竟做错了什么?
void XYZ::setDevice(int num, Device device) {
printf("%s\n", typeid(device).name()); //this prints "Device"
this->devices[num] = device;
}
XYZ::XYZ() {
printf("%s\n", typeid(InputDevice(cin)).name()); //this prints "InputDevice"
setDevice(STANDARD_INPUT_DEVICE, InputDevice(cin));
printf("%s\n", typeid(devices[0]).name());
}
【问题讨论】:
-
更改
void XYZ::setDevice(int num, Device device) {以参数为参考:void XYZ::setDevice(int num, Device& device) { -
这就是所谓的对象切片.根本问题不是
setDevice,而是this->devices[num] = device;,它也会有相同的对象切片问题。您需要存储指向设备的指针(最好是智能指针,如std::unique_ptr<Device>)。
标签: c++ oop inheritance base-class