Вы можете смоделировать инициализацию вашего члена перед базовым классом, сделав его собственным базовым классом, который вы инициализируете первым.Вы можете обернуть его в простой тип класса, и Derived
может наследовать его от этого типа до Base
.В следующем примере Derived
имеет Member _m;
, который инициализируется и затем используется для инициализации Base
.
class Member
{
public:
Member(int) {}
};
class Base
{
public:
Base(const Member&) {}
};
// The new wrapper
struct member_wrapper
{
member_wrapper(int v) : m_(v) {}
Member m_;
};
class Derived : private member_wrapper, public Base
{
public:
Derived() : member_wrapper(123), Base(m_)
{ }
};
Хотя в этом случае, поскольку m_
уже является типом class
и у Derived
нет других членов с этим типом, вы можете просто наследовать напрямую от Member
.Если у вас был не class
тип или несколько членов одного типа, которые нужно было инициализировать до Base
, вам нужно было бы обернуть их.
class Member
{
public:
Member(int) {}
};
class Base
{
public:
Base(const Member&) {}
};
class Derived : private Member, public Base
{
public:
Derived() : Member(123), Base(*this)
{ }
};