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

时间:2016-12-08 03:57:49

标签: c++ inheritance constructor

在过去的十年或二十年中使用C#之后,我的C ++变得有点生疏了。

如果我有以下内容:

class CBase
{
public:
    CBase(LPCTSTR pszArg1, LPCTSTR pszArg2, LPCTSTR pszArg3);
    virtual ~CBase();

    // Etc...
};

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

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

  

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

我知道我可以显式创建派生构造函数:

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

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

基类仍然需要这些或那些参数。有没有办法不必为每个派生类重写这个参数,"暴露"也许是基础构造函数,或者我必须像上面所做的那样绝对做到这一点?

3 个答案:

答案 0 :(得分:9)

您可以使用inheriting constructors(自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

答案 1 :(得分:3)

是的,您可以在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;
};

答案 2 :(得分:2)

仅在C ++ 11及更高版本中,您可以使用using语句inherit the base class's constructors,例如:

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

Live Demo

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

Live Demo

  

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

来自Bjarne Stroustrup' C++11 FAQs - Inherited constructors

  

我已经说过"仅仅是历史事故阻止使用它来为构造函数以及普通的成员函数工作。" C ++ 11提供了该工具