我目前正在开发一个类层次结构,其中类B
继承自A
并使用C ++的功能,它允许通过键入以下内容来直接继承构造函数:
using A::A;
而是复制所有现有的构造函数。有没有办法初始化类B
的类属性,否则将由初始化列表初始化?
类层次结构如下所示,不使用构造函数继承,并编译好:
class A
{
public:
A (int a)
{}
};
class B
:
public A
{
public:
B (int a)
:
A(a),
blubb(a)
{}
float blubb;
};
使用构造函数继承和Revolver_Ocelot建议的答案,代码如下所示:
class A
{
public:
A (int a)
{}
};
class B
:
public A
{
public:
using A::A;
float blubb {a};
};
这给出了以下编译时错误消息:
foo.cpp:21:22: error: ‘a’ was not declared in this scope
float blubb {a};
^
foo.cpp:21:23: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘float’ in initialization
float blubb {a};
^
答案 0 :(得分:3)
在C ++ 11中,您可以使用初始化类变量through brace or equals initializer,否则将在默认初始化成员时使用该变量:
class B : public A
{
using A::A;
MyComplexType foo {ConstructorArgument1, ConstructorArgument2};
};
编辑:由于新情况,我将添加新信息。
如果您提到,除了您想要访问基类构造函数参数之外,没有其他选择,而是创建您自己的带有签名的构造函数。但是,这并不意味着您必须重复代码。相反,您可以将大部分工作委托给基类构造函数,只保留B类中的B类:
class B : public A
{
public:
using A::A;
B(int a) : A(a), blubb(a)
{}
float blubb;
};
如果构造函数参数用于初始化类A中的某个成员,并且派生类可以访问该成员,则可以使用该成员初始化派生类成员:
class A
{
protected:
int y;
public:
A(int a) : y(a)
{}
};
class B : public A
{
int z {y};
public:
using A::A;
};