从T构造函数调用类T的纯虚拟实现而没有限定条件?

时间:2017-03-07 10:31:13

标签: c++ constructor virtual-functions pure-virtual

考虑到来自类T的构造函数的T成员函数(直接或间接)的虚拟调用最多可以归结为T的实现,以下代码,非限定调用,是否有未定义的行为?

注意,为避免噪音:如果您认为在从构造函数调用时不会虚拟调用成员函数,那么请不要在此处回答或评论,而是在单独的SO问题中提出该问题。谢谢。

struct Baze
{
    virtual void foo();
    virtual void bar() = 0;
    Baze(){ foo(); bar(); }
};

void Baze::foo() {}
void Baze::bar() {}

struct Derived: Baze
{
    void bar() override {}
};

int main()
{
    Derived{};
}

1 个答案:

答案 0 :(得分:5)

我认为[class.abstract]/6(N4140)涵盖了这一点:

  

可以从抽象类的构造函数(或析构函数)调用成员函数;制作的效果   对正在创建(或销毁)的对象直接或间接虚拟调用(10.3)纯虚函数   来自这样的构造函数(或析构函数)是未定义的。

所以即使你已经提供了纯虚函数的定义,它仍然是技术上的UB。

有一个核心工作组问题解决了这个问题here。似乎规则不太可能改变,以使这个明确定义。