有啥方法可以在派生类中使用基构造函数?
Posted
技术标签:
【中文标题】有啥方法可以在派生类中使用基构造函数?【英文标题】:Any way to use base constructor in derived class?有什么方法可以在派生类中使用基构造函数? 【发布时间】:2016-12-08 03:57:48 【问题描述】:在过去一两年使用 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)
但这似乎需要大量输入,特别是如果我打算从基类派生许多类。
基类仍然以某种方式需要这些参数。有没有办法不必为每个派生类重写这个参数,也许“暴露”基本构造函数,或者我必须绝对总是像上面那样做?
【问题讨论】:
提供默认构造函数? @NathanOliver:我的基类如何获得参数? @JonathanWood:它没有。但是默认构造函数可以将自己的参数值传递给基类。 即使是组合而不是继承,不会出现同样的问题吗? @NickyC:是的,如果包含的类型具有非默认构造函数。包含类需要显式构造函数才能将参数传递给包含类型的构造函数。 【参考方案1】:你可以使用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
【讨论】:
【参考方案2】:是的,您可以在 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;
;
【讨论】:
【参考方案3】:仅在 C++11 及更高版本中,您可以对 inherit the base class's constructors 使用 using
语句,例如:
class CDerived : public CBase
public:
using CBase::CBase;
;
Live Demo
但是,这不适用于早期 C++ 版本中的构造函数(但它适用于方法):
Live Demo
错误:使用声明不能引用构造函数
来自 Bjarne Stroustrup 的C++11 FAQs - Inherited constructors:
我说过“除了历史事故之外,阻止了将其用于构造函数以及普通成员函数。” C++11 提供了这种功能
【讨论】:
以上是关于有啥方法可以在派生类中使用基构造函数?的主要内容,如果未能解决你的问题,请参考以下文章
C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]