c++ - C++派生类在初始化之前调用基类上的方法
问题描述
这是一个简单的程序,我很确定它有未定义的行为,但我想确定。
struct A {
int x;
A(int y):x(y) {}
int foo() { return x; }
};
struct B : public A {
B():A(foo()) {}
};
我假设这具有未定义的行为,因为调用A::foo
发生在A
对象被构造之前并且它读取一个未初始化的类变量。
但是,如果实现A::foo
改为{ return 0; }
而不是{ return x; }
,即函数不访问类成员,它仍然是未定义的行为吗?
进一步的问题 - 如果A::foo
是,有什么改变virtual
吗?
解决方案
这在这两种情况下都是未定义的行为(包括虚拟成员函数),如class.base.init中所指定:
可以为正在构造的对象调用成员函数(包括虚拟成员函数,[class.virtual])......但是,如果这些操作是在 ctor-initializer 中执行的(或者在从 ctor-initializer 中直接或间接调用的函数中)初始化程序)在基类的所有内存初始化程序完成之前,程序具有未定义的行为。
此要点基本上包含您提供的示例代码片段,并明确指出未定义的行为。
推荐阅读
- tensorflow - 如何微调预训练的 GAN?
- domain-driven-design - 存储库的 create 方法应该返回什么类型?
- google-sheets - 如果选中 NONE,则突出显示复选框行
- android - 如何从 Jetpack Work Manager 测试工人链中工人之间的依赖关系
- python - CNN 是否应该采用所有用于训练的输入来预测新样本?
- plotly - Plotly Dash 中的桑基图
- vue.js - PWA InjectManifest 工作箱控制台/调试输出突然被禁用(Vue.js/Quasar 框架)
- azure - 删除 API 正常工作时,Azure 队列删除休息 API 返回“无内容”
- html - 在同一行显示 2 个输入
- python - Discord python,on_raw_reaction_add 中的 if/else 不起作用