在成员构造函数之后调用基类构造函数
Posted
技术标签:
【中文标题】在成员构造函数之后调用基类构造函数【英文标题】:Call base class constructor after member constructor 【发布时间】:2018-09-10 16:10:38 【问题描述】:我有以下类层次结构,其中基类依赖其派生类在其构造函数中为其提供参数:
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_
的构造函数,或者我应该只修改我的类层次结构?
【问题讨论】:
可以Member m_
只是在基类构造函数中初始化的Base
的(受保护的)成员吗?有理由支持继承而不是组合吗?
在这种特殊情况下,您可以写Derived() : Base(Member(123)), m_(123)
,但我觉得您离实际问题太远了;)
【参考方案1】:
您可以在基类之前模拟初始化您的成员,方法是使其成为您自己首先初始化的基类。您可以将它包装在一个简单的类类型中,并让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)
;
【讨论】:
以上是关于在成员构造函数之后调用基类构造函数的主要内容,如果未能解决你的问题,请参考以下文章