在派生类中使用基本构造函数的任何方法
Any way to use base constructor in derived class?
在使用C#过去十年或两年后,我的C 有点生锈。
如果我有以下内容:
class CBase
{
public:
CBase(LPCTSTR pszArg1, LPCTSTR pszArg2, LPCTSTR pszArg3);
virtual ~CBase();
// Etc...
};
class CDerived : CBase
{
// Etc...
};
看来我无法创建CDerived
的实例。
没有构造函数的实例" cdedived :: cdedived"与参数列表匹配
我知道我可以明确创建一个派生的构造函数:
CDerived::CDerived(LPCTSTR pszArg1, LPCTSTR pszArg2, LPCTSTR pszArg3)
: CBase(pszArg1, pszArg2, pszArg3)
{
}
,但这似乎是很多打字,特别是如果我打算从基类中得出许多类。
基类仍然需要以一种或另一种方式。是否有一种方法可以不必为每个派生类重写此论点,也许是"公开"基本构造函数,或者我绝对必须像上面做过一样?
您可以使用继承的构造函数(因为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
是的,您可以在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;
};
在C 11及以后,您可以使用using
语句继承基类的构造函数,例如:
class CDerived : public CBase
{
public:
using CBase::CBase;
};
实时演示
但是,这对于早期C 版本中的构造函数不起作用(不过,它适用于方法):
实时演示
错误:使用声明不能参考构造函数
来自Bjarne Stroustrup的C 11常见问题解答 - 继承的构造函数:
我说过:"不仅仅是历史事故阻止使用它用于构造函数以及对于普通成员功能。"C 11提供了该设施
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 为什么我的突变器函数没有设置任何内容?还是我的构造函数?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 在将匿名对象作为参数传递时,不会调用任何构造函数
- uninit_member:非静态类成员m_wszParams未在此构造函数中初始化,也不在它C++中调用的任何函数中初
- 我们可以直接为任何数据成员赋值. 为什么要使用构造函数?
- 是否有任何常规方法可以通知 STL 移动和复制构造函数?
- 构造函数超载以接受任何功能
- 任何操作员,功能调用和构造函数的通用持续时间表
- 如果默认构造函数不执行任何操作,则目的是什么
- 创建一个构造函数,即Capabe获取任何数量的参数
- C 标准中是否有任何计划来解决初始化器列表构造函数的不一致性
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 即使没有任何要复制的对象,是否会自动调用复制构造函数?
- 试图在具有std ::任何构造函数的基类中调用复制构造函数的问题
- 复制列表类的构造函数,而无需在实现中使用任何方法
- 需要使班级(long_number)用构造函数和一个打印功能代表1到60的任何长度
- 在构造函数以外的任何其他位置访问相机时,我的相机指针返回 null