gpt4 book ai didi

c++ - 有没有办法在继承构造函数时访问初始化列表?

转载 作者:太空狗 更新时间:2023-10-29 21:16:13 26 4
gpt4 key购买 nike

我目前正在研究一个类层次结构,其中一个类 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};
^

最佳答案

在 C++11 中,您可以使用初始化类变量 through brace or equals initializer否则成员将被默认初始化时将使用它:

class B : public A
{
using A::A;
MyComplexType foo {ConstructorArgument1, ConstructorArgument2};
};

编辑:由于新情况,我将添加新信息。

如果你提到,如果你想访问基类构造函数参数,除了创建你自己的带有你想要的签名的构造函数之外别无选择。但是,这并不意味着您必须复制代码。相反,您可以将大部分工作委托(delegate)给基类构造函数,只将 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;
};

关于c++ - 有没有办法在继承构造函数时访问初始化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35769281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com