C++中基类引用派生类成员的行为是否有明确定义?
结论先行
这段代码的合法性取决于你在基类中操作引用的时机,部分场景属于未定义行为,部分场景合法:
基类构造函数阶段
按照C++标准的构造顺序,派生类的成员变量构造时机晚于基类构造完成时间。你在派生类初始化列表中将m_derObj的引用传给基类构造函数时,m_derObj的存储已经分配但尚未执行构造逻辑。- 如果你只是在基类构造函数中将引用保存到成员变量
m_obj,不访问m_obj指向的对象内容(不调用成员函数、不读取/修改成员变量),这个行为是合法的。 - 如果你在基类构造函数中直接访问
m_obj的内容,属于未定义行为,运行结果不可预期。
- 如果你只是在基类构造函数中将引用保存到成员变量
基类析构函数阶段
析构顺序和构造顺序完全相反:派生类析构函数执行完成后,会先销毁派生类自己的成员变量,最后才执行基类的析构函数。因此基类析构函数执行时,m_derObj已经被销毁,此时无论做任何访问m_obj的操作,都属于未定义行为。普通成员函数
SomeMethod调用阶段
只要调用SomeMethod的时机是在Derived对象完全构造完成之后、Derived对象开始析构之前,此时m_derObj已经完成构造且未被销毁,访问m_obj的行为完全合法,不存在问题。
注意:这种设计本身风险极高,只要基类的构造/析构函数不小心操作了引用,就会触发未定义行为,实际工程中非常不推荐这种写法,建议调整继承逻辑或者成员的归属,避免将派生类成员的引用提前传给基类。
内容的提问来源于stack exchange,提问作者mile4712
相关产品推荐
相关产品推荐

