将类成员传递给基类构造函数(通过引用)

时间:2014-10-14 07:15:25

标签: c++

鉴于ConcreteBar实现BarIfc的以下类:

class Base {

public:

    Base(BarIfc& bar) : _bar(bar) { }

    void foo() {
        _bar.bar();
    }

private:

    Base(const Base& other);
    Base& operator=(const Base& other);

    BarIfc& _bar; // Pure virtual interface
};

class Child : public Base {

public:
    // bar is passed to base class before initialization
    Child(int i) : Base(_bar), _bar(i) { 
    }

private:

    Child(const Child& other);
    Child& operator=(const Child& other);

    ConcreteBar _bar;
};

我是否正确地假设这个

Child(int i) : Base(_bar), _bar(i) {}

是"有效" C ++,只要我不在基类的初始化列表中使用(例如调用方法)_bar引用?

2 个答案:

答案 0 :(得分:9)

假设ConcreteBar是子对象

它是有效的,因为存储已分配给§3.7.5/ 1

  

成员子对象,基类子对象的存储持续时间   数组元素是它们的完整对象(1.8)。

和§3.8/ 5说:

  

在对象的生命周期开始之前但在存储之后   对象将占用的对象将被分配,或者在生命周期之后   一个对象已经结束并且在存储对象之前   被占用被重用或释放,任何指向存储的指针   可以使用对象将位于或位于的位置   以有限的方式。对于正在建造或毁坏的物体,请参阅   12.7 [指非静态成员用法]

只要你不使用引用就行有效。

答案 1 :(得分:7)

是的,它是有效的,因为虽然尚未构建_bar,但它的存储确实存在,并且只要您实际上没有使用该引用,就可以参考它。在派生类构造函数体中。

这是关于类似主题的另一篇文章,您可能会发现这些帖子很有启发性:https://stackoverflow.com/a/5905746/4323

最后,一个引用标准的答案:https://stackoverflow.com/a/6258431/4323说:

  

在对象的生命周期开始之前但在存储之后   该对象占用的位置已被分配[...],   任何引用存储的指针   可以使用对象将位于或位于的位置   以有限的方式。