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

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】:

您可以在基类之前模拟初始化您的成员,方法是使其成为您自己首先初始化的基类。您可以将它包装在一个简单的类类型中,并让DerivedBase 之前从该类型私有继承。在下面的示例中,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)
     
;

【讨论】:

以上是关于在成员构造函数之后调用基类构造函数的主要内容,如果未能解决你的问题,请参考以下文章

类学习

C++中派生类的构造函数怎么显式调用基类构造函数?

C#在自己的构造函数之后调用基类的构造函数?

生成一个派生类对象时,调用基类和派生类构造函数按啥次序

继承类中的构造函数?

基类构造函数的派生类成员初始化