正在从成员构造函数调用虚拟函数



我对以下行为感到好奇:

#include <iostream>
#include <string>
struct A;
struct B {
    std::string b;
    B(A& a);
};
struct A {
    B member;
    virtual std::string f() { return "Hello, World!"; }
    A() : member(*this) {}
};
B::B(A& a) : b(a.f()) {}
int main() {
    std::cout << A().member.b;
}

打印预期结果是否需要?还是这是未定义的行为?

这是合法的。§12.7[类别cdtor]/p4:

成员函数,包括虚拟函数(10.3),可以调用在建造或破坏期间(12.6.2)。当虚拟功能直接或间接从构造函数或从销毁器,包括在建造或销毁类的非静态数据成员,以及调用的对象applies是正在构建或销毁的对象(称之为x),调用的函数是构造函数或中的最后一个重写器析构函数的类,而不是在更派生的类中重写它。如果虚拟函数调用使用显式类成员访问(5.2.5),对象表达式是指x的完整对象或该对象的基类子对象之一,但不是x或其基类子对象,行为未定义。

UB案例不适用于此。

最新更新