如何在继承类之前初始化成员变量

时间:2021-06-15 13:44:20

标签: c++ class

我正在尝试创建一个需要首先初始化成员变量的类。我知道为什么会发生这种情况,但有没有办法解决这个问题?

当前打印顺序: 第二 先

想要的打印订单: 第一的 第二个

#include <iostream>

struct A {
    A() {
        std::cout << "first" << '\n';
    }
};

struct B {
    B() {
        std::cout << "second" << '\n';
    }
};

struct C : public B {

    C() : a(), B() {

    }

    A a;

};

int main() {

    C c;

    return 0;
} 

3 个答案:

答案 0 :(得分:6)

将需要首先初始化的成员粘贴到结构中,并在 B 之前从该结构中私下继承。

struct A {
    A() { std::cout << "first" << '\n'; }
};

struct B {
    B() { std::cout << "second" << '\n'; }
};

struct Members { A a; };

struct C : private Members, public B {
    C() : Members(), B() {}
};

int main() {
    C c;
} 

这样做的缺点是无法避免将“成员结构”暴露给外界,但这在实践中应该不成问题。

答案 1 :(得分:4)

在 C++ 中,基类将在派生类的任何成员变量之前初始化。

鉴于您提供的信息,最好的办法是选择组合而不是继承:

struct A {
    A() {
        std::cout << "first" << '\n';
    }
};

struct B {
    B() {
        std::cout << "second" << '\n';
    }
};

struct C {
    A a;
    B b;
};

这将展示desired behavior

答案 2 :(得分:-2)

使 A 成为 C 的必要参考:

#include <iostream>

struct A {
    A() {
        std::cout << "first" << '\n';
    }
};

struct B {
    B() {
        std::cout << "second" << '\n';
    }
};

struct C : public B {
    C(const A& a) : _A(a), B() {}
    const A& _A;
};

int main() {
    A a;
    C c(a);
    return 0;
}