2016-12-08 134 views
4

在过去的一两年中使用C#之后,我的C++已经有点生疏了。任何方式在派生类中使用基构造函数?

如果我有以下几点:

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

    // Etc... 
}; 

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

看来我不能创建的CDerived一个实例。

no instance of constructor "CDerived::CDerived" matches the argument list

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

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

但是,这似乎是一个大量的输入,特别是如果我打算从基类派生出许多类。

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

+0

提供一个默认的构造函数? – NathanOliver

+0

@NathanOliver:这是如何得到我的基类的参数? –

+0

@JonathanWood:没有。但是默认的构造函数可以将自己的参数值传递给基类。 –

回答

7

你可以使用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 
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

在C++ 11及更高版本,可以使用using声明inherit the base class's constructors,例如:

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

Live Demo

然而,这并没有在早期的C++版本的构造函数的工作(它为方法,虽然):

Live Demo

error: using declaration cannot refer to a constructor

从Bjarne的Stroustrup的C++11 FAQs - Inherited constructors

I have said that "Little more than a historical accident prevents using this to work for a constructor as well as for an ordinary member function." C++11 provides that facility

相关问题