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



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

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的构造函数中,当Derived所依赖的成员变量m_尚未初始化时,首先调用Base构造函数。

有没有办法强制编译器首先调用m_的构造函数,或者我应该重新设计我的类层次结构?

可以通过使成员成为您首先初始化的自己的基类来模拟在基类之前初始化成员。您可以将其包装在一个简单的类类型中,并在Base之前Derived私下继承该类型。在下面的示例中,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私下继承。如果在Base之前需要初始化非class类型或同一类型的多个成员,则需要包装它们。

class Member
{
public:
Member(int) {}
};
class Base
{
public:
Base(const Member&) {}
};
class Derived : private Member, public Base
{
public:
Derived() : Member(123), Base(*this)
{ }
};

最新更新