有啥方法可以在派生类中使用基构造函数?

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++中的虚函数有啥作用?

C++如何使用派生类构造函数销毁基类中的对象

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

虚函数和基类中的this指针的问题!

请问把基类构造函数声明为protected有啥好处呢(抽象基类)

派生类中的构造函数