从成员构造函数调用虚函数

时间:2014-09-08 11:35:18

标签: c++

我很好奇以下行为:

#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;
}

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

1 个答案:

答案 0 :(得分:6)

这是合法的。 §12.7[class.cdtor] / p4:

  

可以调用成员函数,包括虚函数(10.3)   在施工或毁坏期间(12.6.2)。当一个虚函数   从构造函数或从构造函数直接或间接调用   析构函数,包括在构造或破坏期间   class的非静态数据成员,以及调用的对象   apply是构造或销毁中的对象(称为x),   被调用的函数是构造函数中的最终覆盖   析构函数的类,而不是在更派生的类中重写它。   如果虚函数调用使用显式类成员访问   (5.2.5)并且对象表达式引用x的完整对象   或者该对象的基类子对象之一,但不是x或其中之一   它的基类子对象,行为未定义。

UB案例不适用于此。