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

时间:2016-12-29 14:34:25

标签: c++ inheritance

我正在努力进行类继承构造顺序。假设我有这两个类:

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,因为类继承Ex的工作原理如下:

  • 构造始终从基类开始。如果有多个基类,那么它从最左边的基数开始。
  • 然后它转向成员字段。它们按照声明的顺序初始化。
  • 最后,班级本身就构建了。
  • 析构函数的顺序正好相反。

有没有办法强制成员常量首先初始化?这是最干净的方法吗?

1 个答案:

答案 0 :(得分:5)

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

在构造类对象之前初始化

static(除非它们也是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();
    }
};