C++ 调用类T';从T构造函数无条件实现纯虚拟?

C++ 调用类T';从T构造函数无条件实现纯虚拟?,c++,constructor,virtual-functions,pure-virtual,C++,Constructor,Virtual Functions,Pure Virtual,考虑到从类T的构造函数对T成员函数的虚拟调用(直接或间接)最多可以下到T的实现,下面的代码(使用非限定调用)是否具有未定义的行为 请注意,为了避免噪音:如果您认为从构造函数调用成员函数时不会实际调用成员函数,那么请不要在此处回答或评论,而是在单独的SO问题中提出该问题。多谢各位 struct Baze { virtual void foo(); virtual void bar() = 0; Baze(){ foo(); bar(); } }; void Baze::f

考虑到从类
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{};
}

我相信
[class.abstract]/6
(N4140)已经涵盖了这一点:

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

因此,尽管您已经为纯虚拟函数提供了定义,但从技术上讲,它仍然是UB


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

匿名投票人,请解释你的否决票。你向潜在的否决票群体发出了相互矛盾的指示:他们应该解释他们的投票,而不是在这里发表评论。@M.M.不,他们不应该出于无知而否决投票,但是把这个问题作为一个问题提出来。如果我注意到了这一点,我会投票以重复的方式结束哦,天哪,这个问题有3票反对。这说明了很多关于堆栈溢出的问题。它吸引了各种各样的(插入合适的形容词)用户,使它成为网络上的第一个Herb Schildt网站。谢谢,这看起来很清楚。问题是G++和Visual C++都编译了代码,没有警告(甚至不是来自G++,即使有<代码> -WORD WORD -学究错误 >)Cleangthth.-阿尔夫,UB,不是不好的。(在您的示例中,很明显将调用纯虚拟,但如果对
bar
的调用来自另一个函数,而该函数从未实际从构造函数调用
bar
,但从其他函数调用时可能会调用,那么这将更为棘手。)感谢DR参考。:)