首页 > 解决方案 > 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吗?

标签: c++language-lawyer

解决方案


这在这两种情况下都是未定义的行为(包括虚拟成员函数),如class.base.init中所指定:

可以为正在构造的对象调用成员函数(包括虚拟成员函数,[class.virtual])......但是,如果这些操作是在 ctor-initializer 中执行的(或者在从 ctor-initializer 中直接或间接调用的函数中)初始化程序)在基类的所有内存初始化程序完成之前,程序具有未定义的行为。

此要点基本上包含您提供的示例代码片段,并明确指出未定义的行为。


推荐阅读