在继承中更改构造函数的顺序

Change the order of constructors in inheritance

本文关键字:构造函数 顺序 继承      更新时间:2023-10-16

我在阶级继承构建顺序中挣扎。假设我有这两个类:

class A {
public:
    const int CONSTANT_A;
    A(const int constant) : CONSTANT_A(constant) {
    }
    void write() {
        std::cout << CONSTANT_A;
    }
};

class B : public A {
public:
    const int CONSTANT_B = 3;
    B() :A(CONSTANT_B) {
        write();
    }
};

创建新对象B时,CONSTANT_A不是3

  • 构造总是从基类开始。如果有多个基类,则它是从左多数基础开始的。
  • 然后是会员字段的转弯。它们是按声明的顺序初始化的。
  • 在最后一个班级本身是构建的。
  • 驱灾的顺序完全逆转。

是否有一种方法可以迫使成员常数先初始化?哪种是最干净的方法?

您的常数B::CONSTANT_B可以是static,因为它不取决于构造函数参数。

static s在构造类对象之前是初始化的(除非这些对象也是 static!)。

struct B : A
{
    static const int CONSTANT_B = 3;
    B() : A(CONSTANT_B)
    {
        write();
    }
};

如果B::CONSTANT_B本身从构造函数参数中获取了其价值,则您可能必须在 ctor-member-initialiser 中两次命名该参数。据我所知,这没有微不足道的解决方法。

struct B : A
{
    const int CONSTANT_B;
    B(const int constant)
       : A(constant)
       , CONSTANT_B(constant)
    {
        write();
    }
};