在派生类中使用基本构造函数的任何方法

Any way to use base constructor in derived class?

本文关键字:构造函数 任何 方法 派生      更新时间:2023-10-16

在使用C#过去十年或两年后,我的C 有点生锈。

如果我有以下内容:

class CBase
{
public:
    CBase(LPCTSTR pszArg1, LPCTSTR pszArg2, LPCTSTR pszArg3);
    virtual ~CBase();
    // Etc...
};
class CDerived : CBase
{
    // Etc...
};

看来我无法创建CDerived的实例。

没有构造函数的实例" cdedived :: cdedived"与参数列表匹配

我知道我可以明确创建一个派生的构造函数:

CDerived::CDerived(LPCTSTR pszArg1, LPCTSTR pszArg2, LPCTSTR pszArg3)
    : CBase(pszArg1, pszArg2, pszArg3)
{
}

,但这似乎是很多打字,特别是如果我打算从基类中得出许多类。

基类仍然需要以一种或另一种方式。是否有一种方法可以不必为每个派生类重写此论点,也许是"公开"基本构造函数,或者我绝对必须像上面做过一样?

您可以使用继承的构造函数(因为C 11):

class CDerived : public CBase
{
public:
    using CBase::CBase;
    // Etc...
};

然后你可以

LPCTSTR pszArg1;
LPCTSTR pszArg2;
LPCTSTR pszArg3;
CDerived d(pszArg1, pszArg2, pszArg3); // initialize CBase subobject by CBase::CBase(LPCTSTR, LPCTSTR LPCTSTR), 
                                       // then default-initialize other members of CDerived

是的,您可以在C 11及更高版本中执行此操作。要继承基本构造函数,您必须使用using关键字,然后使用基类构造函数的名称:

struct CBase {
    CBase(LPCTSTR pszArg1, LPCTSTR pszArg2, LPCTSTR pszArg3);
    virtual ~CBase();
    // Etc...
};
struct CDerived : CBase {
    // we use the base constructor
    using CBase::CBase;
};

在C 11及以后,您可以使用using语句继承基类的构造函数,例如:

class CDerived : public CBase
{
public:
    using CBase::CBase;
};

实时演示

但是,这对于早期C 版本中的构造函数不起作用(不过,它适用于方法):

实时演示

错误:使用声明不能参考构造函数

来自Bjarne Stroustrup的C 11常见问题解答 - 继承的构造函数:

我说过:"不仅仅是历史事故阻止使用它用于构造函数以及对于普通成员功能。"C 11提供了该设施

相关文章: