Inheritance 用RAII和继承实现构造函数

Inheritance 用RAII和继承实现构造函数,inheritance,constructor,c++-cli,raii,Inheritance,Constructor,C++ Cli,Raii,我正在为我们公司的设备开发一个硬件库,其中包括需要访问摄像头和各种照明的设备。基本硬件接口的设计如下 public ref class IHardware abstract { protected: ICamera* camera; ILight^ light; ... public: IHarware(); ... virtual bool acquireImage() abstract; ... }; 这里,ICamera和ILi

我正在为我们公司的设备开发一个硬件库,其中包括需要访问摄像头和各种照明的设备。基本硬件接口的设计如下

public ref class IHardware abstract {

protected:
    ICamera* camera;
    ILight^ light;
    ...

public:
    IHarware();
    ...
    virtual bool acquireImage() abstract;
    ...
};
这里,
ICamera
ILight
是相应硬件部件的接口。 我需要开发的DLL包含上述接口以及我们标准设备的专用
IHardware
,我们称之为
SHardware
。对于
ICamera
ILight
也存在该设备的特殊化,即
SCamera
SLight
。 因为我想使用RAII,所以
SHardware
的构造函数如下

SHardware::SHardware : IHardware() {
    ...
    camera = new SCamera();
    camera->Init();
    light = gcnew SLight();
    light->Init();
    ...
}
现在,假设我想使用SHardware类进行进一步的特殊化,例如,对于一个名为
NHardware
的类。我有
NCamera
SCamera
写入的类和
NLight
SLight
写入的类。我的问题是如何实现
NHardware
的构造函数;如果是

NHardware::NHardware() : SHardware() {...}
camera
light
已经在
shardaware()
中初始化,因此在创建
NCamera
NLight
对象之前,我必须
删除它们,这对我来说似乎不正确。当然,我可以在一个单独的虚拟函数中以某种方式提取相机和照明初始化,并在
NHardware
类中重写它,但是当调用
SHardware
构造函数时,不是也首先使用
SHardware
初始化函数吗? 我相信这是一个非常常见的问题,解决方法非常简单,但现在我不明白,所以非常感谢您的帮助!谢谢


Matz

为什么不使用
受保护的
构造函数和允许禁用子对象实例化的参数?(或直接将新的子对象传递给它)谢谢。有时候,我只是没有想到简单的解决办法。