我有一个抽象类,称为 UsbDevice(主要是纯虚拟的)。它做的不多,但三个派生类做了:
class WindowsUsbDevice : public UsbDevice
class LinuxUsbDevice : public UsbDevice
class OsxUsbDevice : public UsbDevice
这些类中的每一个都没有真正添加任何公共方法——相反,它们只是 UsbDevice 抽象类的不同实现。
现在,我想创建一个派生自这些类中的任何一个的新类,我们称之为 FancyUsbDevice。可以说它代表一个特定的设备。
这个新类需要公开完整的 UsbDevice 接口(由中间类实现),以及公开一些只使用 UsbDevice 接口上的方法的花哨的高级函数——不需要公开任何特定于这些中间类之一的东西.
我可以看到三种可能的选择,我想知道它们是否可行,以及哪一种是最好的。
A) 不要继承,而是让 FancyUsbDevice HAS-A UsbDevice* 而不是 IS-A。(回避问题。我不喜欢这个选项,但感觉很安全。)
B)假设我有一个罕见的优势,即只有其中一个类实际上构建在任何特定平台上,#ifdef 继承字符串:(再次回避问题)
#ifdef WIN32
class FancyUsbDevice : public WindowsUsbDevice
#endif
#ifdef LINUX
class FancyUsbDevice : public LinuxUsbDevice
#endif
...
C) 模板!从模板类型继承:
Template<typename T> class FancyUsbDevice : public T
将其构造为子类型,并将其转换为接口:
FancyUsbDevice<WindowsUsbDevice> fancy_device;
FancyUsbDevice<UsbDevice> generic_fancy_device = dynamic_cast<FancyUsbDevice<UsbDevice>>(fancy_device);
但是,我认为这行不通,至少因为编译器会认为 generic_fancy_device 小于 fancy_device,并且所有成员变量都会被偏移和破坏。(我认为)
谢谢!很抱歉互换使用接口/抽象/纯虚拟。