C++ 避免虚拟基类的显式构造函数调用

C++ 避免虚拟基类的显式构造函数调用,c++,inheritance,constructor,com,virtual-inheritance,C++,Inheritance,Constructor,Com,Virtual Inheritance,基本问题:是否可以避免显式调用每个虚拟基类的(非默认)构造函数 背景:我正在研究Windows COM对象周围的一些类型安全的C++包装类。我目前的方法是使用一个CBaseCOMWrapper类,它封装了一个IUnknown对象以进行引用计数。然后,我有一个CCOMWrapper模板类,该类继承自CBaseCOMWrapper,它定义了特定COM类型的包装(即IDXGIObject,ID3D11Device,等等)。最后,从这些包装器模板继承单独的类以提供实际/额外的功能(即CDXGIObje

基本问题:是否可以避免显式调用每个虚拟基类的(非默认)构造函数

<强>背景:我正在研究Windows COM对象周围的一些类型安全的C++包装类。我目前的方法是使用一个

CBaseCOMWrapper
类,它封装了一个
IUnknown
对象以进行引用计数。然后,我有一个
CCOMWrapper
模板类,该类继承自
CBaseCOMWrapper
,它定义了特定COM类型的包装(即
IDXGIObject
ID3D11Device
,等等)。最后,从这些包装器模板继承单独的类以提供实际/额外的功能(即
CDXGIObject
CD3D11Device

例如,我有以下课程(成员省略):

类CBaseCOMWrapper{};
模板//在这里,T应该从IUnknown继承
类CCOMWrapper:公共虚拟CBaseCOMWrapper{};
类CDXGIObject:公共虚拟CCOMWrapper{};
模板
类ccomwraper:公共虚拟ccomwraper{};
类CDXGIAdapter:公共虚拟CCOMWrapper{};
下面是类型层次结构的对应关系图:

左栏为实际对象,中栏为精简COM包装器,右栏为实际COM对象。实心箭头表示继承,虚线箭头表示封装

使用模板> >代码> CCOMWRAPPER < /C> >,在中间提供父子关系。

问题:包装器类假定一个指向COM对象的非空(又称有效)指针,因此我不能使用默认构造函数。因为层次结构充满了“钻石”,很多继承都是虚拟的;这意味着每个类的构造函数必须调用构造函数。因此,在上面的示例中,
CDXGIAdapter
的构造函数必须调用
CCOMWrapper
CDXGIObject
CCOMWrapper
CBaseCOMWrapper
的构造函数。随着层次结构的扩展(即,
ID3D11Predicate
的继承链有4个“links”长),这意味着必须调用更多的构造函数

可能的解决方案:理想情况下,我希望使用宏来生成大多数基本构造函数调用,但我必须为每个COM对象提供整个继承链;对于不同长度的链,这将需要不同的宏。然而,最长的长度是4(我只使用DXGI、D3D11和D2D1),所以这不是不可能的


那么如何避免调用所有构造函数呢?或者,有没有更好的方法来实现我想做的事情?

因此,对于我想完成的事情,
CCOMWrapper
模板是不必要的。我只需要每个类提供一个采用相应COM对象类型的构造函数:

class CDXGIObject : public CCOMObject
{
public:
    CDXGIObject(IDXGIObject *obj);
};

class CDXGIFactory : public CDXGIFactory
{
public:
    CDXGIFactory(IDXGIFactory *obj);
};

这消除了对虚拟继承的需要,因此我不再需要调用所有的基本构造函数。

对于任何模糊/奇怪的语句,我深表歉意;我在历史课中间写过这篇文章:C++包装类类的历史?
class CDXGIObject : public CCOMObject
{
public:
    CDXGIObject(IDXGIObject *obj);
};

class CDXGIFactory : public CDXGIFactory
{
public:
    CDXGIFactory(IDXGIFactory *obj);
};