【问题标题】: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) {},但我觉得您离实际问题太远了;)

标签: c++ class oop inheritance


【解决方案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)
    { }
};

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 2013-01-11
    • 2015-08-18
    • 2012-09-28
    • 2016-07-19
    • 2018-07-21
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多