在成员构造函数之后调用基类构造函数

时间:2018-09-10 16:10:38

标签: c++ class oop inheritance

我具有以下类层次结构,其中Base类依赖于其派生类在其构造函数中为其提供参数:

class Member
{
public:
    Member(int v);  
};

class Base
{
public:
    Base(const Member& m);  
};

class Derived : public Base
{
public:
    Derived() : m_(123), Base(m_) // <- here is the problem
    {
    }

private:
    Member m_;
};

但是问题是,在Derived的成员变量Base所依赖的Derived的构造函数中,首先调用m_构造函数尚未初始化。

是否有一种方法可以强制编译器首先调用m_的构造函数,还是应该只重做我的类层次结构?

1 个答案:

答案 0 :(得分:2)

您可以通过使其成为您自己首先初始化的基类来模拟在基类之前对成员进行初始化。您可以将其包装为简单的类类型,并在phoneNumbers之前让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)
    { }
};