鉴于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
引用?
答案 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说:
在对象的生命周期开始之前但在存储之后 该对象占用的位置已被分配[...], 任何引用存储的指针 可以使用对象将位于或位于的位置 以有限的方式。