c++ - 可以在初始化列表中使用基类属性吗?

标签 c++

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

#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,它在构造期间被修改,作为初始化 att_b 的函数的输入B 类。我的顾虑是:

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

最佳答案

  • 它会导致未定义的行为吗?

    没有。

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

  • 这是实现您想要的目标的好方法吗?

    由于您没有告诉我们您打算用这些类做什么,所以我无法告诉您这是否是一个好方法,但如果它符合您的需要,您可以这样做。

关于c++ - 可以在初始化列表中使用基类属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35261421/

相关文章:

c++ - 用户定义类中的 Bool 作为函数 c++ 出现问题

c++ - 在 “function name” 运算符后面键入参数 <T>

c++ - 如何阅读 C++ 指针构造?

c++ - 使用流语法增加编译时错误消息

c++ - 如何在 C++ 中将数组中的所有元素初始化为相同的数字

c++ - 如何在斐波那契数列中找到 'n' 项?

c++ - 访问同名的外部结构

c++ - 如何让我自己的 C++ 编译器理解模板、嵌套类等 C++ 的强大功能?

c++ - 在 C++/CLI 中从 native 转换为管理 unsigned short 的最快方法

c++ - C++中的哈希表