是否可以在初始化列表中使用基类属性

Is it ok to use base class attribute in the initialization list?

本文关键字:基类 属性 列表 初始化 是否      更新时间:2023-10-16

我有一个类,它有一个属性,其值取决于其基类中的属性。此基类属性在构造函数中修改,因此我在修改后需要其值。我试图在这个例子中总结这个想法:

#include <string>
#include <iostream>
class A
{
public:
    int att_a;
    A(int x) : att_a(x) {
        att_a++;
    }; // att_a is being modified in the constructor of A
};
class B : public A
{
public:
    std::string att_b; // att_b is from a different type than att_a but its value is obtained from att_a
    B(int y) : A(y), att_b(std::to_string(att_a)) {};
};
int main(int argc, char const *argv[])
{
    B b = B(3);
    std::cout << b.att_b << std::endl;
    return 0;
}

我正在使用 class A 中的属性 att_a ,该属性在构造过程中进行了修改,作为初始化class B att_b的函数的输入。我担心的是:

  • 这是实现我想要的好方法吗?
  • 即使它编译并运行,在某些情况下它会导致未定义的行为吗?
  • 它会导致未定义的行为吗?

    不。

    使用成员初始化列表时,顺序是完全定义的:首先是基类的顺序,然后是成员的顺序。因此,在创建任何成员时,将实例化所有基类和所有以前声明的成员。如果在构造函数中切换顺序,编译器应输出警告。

  • 这是实现你想要的好方法吗?

    由于您没有告诉我们您将如何处理这些课程,因此我无法告诉您这是否是一个好方法,但是如果它符合您的需求,您可以这样做。