考虑到来自类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{};
}
答案 0 :(得分:5)
我认为[class.abstract]/6
(N4140)涵盖了这一点:
可以从抽象类的构造函数(或析构函数)调用成员函数;制作的效果 对正在创建(或销毁)的对象直接或间接虚拟调用(10.3)纯虚函数 来自这样的构造函数(或析构函数)是未定义的。
所以即使你已经提供了纯虚函数的定义,它仍然是技术上的UB。
有一个核心工作组问题解决了这个问题here。似乎规则不太可能改变,以使这个明确定义。