在过去的十年或二十年中使用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)
{
}
但这似乎很多打字,特别是如果我打算从基类派生出很多类。
基类仍然需要这些或那些参数。有没有办法不必为每个派生类重写这个参数,"暴露"也许是基础构造函数,或者我必须像上面所做的那样绝对做到这一点?
答案 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;
};
但是,这对于早期C ++版本中的构造函数不起作用(但它适用于方法):
错误:使用声明不能引用构造函数
来自Bjarne Stroustrup' C++11 FAQs - Inherited constructors:
我已经说过"仅仅是历史事故阻止使用它来为构造函数以及普通的成员函数工作。" C ++ 11提供了该工具