gpt4 book ai didi

c++ - 为什么从构造函数对纯虚函数的虚调用是 UB,而标准允许对非纯虚函数的调用?

转载 作者:IT老高 更新时间:2023-10-28 22:13:59 29 4
gpt4 key购买 nike

从 10.4 抽象类段落开始。标准中的 6:

“可以从抽象类的构造函数(或析构函数)调用成员函数;对于从这样的构造函数创建(或销毁)的对象,直接或间接地对纯虚函数进行虚调用的效果(或析构函数)未定义。”

假设标准允许从构造函数(或析构函数)调用非纯虚函数,为什么会有区别?

[编辑] 更多关于纯虚函数的标准引用:

§ 10.4/2 通过在类定义的函数声明中使用纯说明符 (9.2) 来纯指定虚函数。 纯虚函数仅在使用或如同使用 (12.4) 限定 ID 语法 (5.1) 调用时才需要定义。 ... [注意:函数声明不能​​同时提供纯说明符和定义——尾注]

§ 12.4/9 析构函数可以声明为虚拟(10.3)或纯虚拟(10.4);如果在程序中创建了该类或任何派生类的任何对象,应定义析构函数。

需要回答的一些问题是:

  • 如果没有给纯虚函数一个实现,这不应该是编译器或链接器错误吗?

  • 已经给纯虚函数一个实现了,为什么在这种情况下不能很好的定义调用这个函数呢?

最佳答案

因为虚调用永远不能调用纯虚函数——调用纯虚函数的唯一方法是显式(限定)调用。

现在在构造函数或析构函数之外,这是因为你永远不能真正拥有抽象类的对象。相反,您必须有一个覆盖纯虚函数的非抽象派生类的对象(如果它没有覆盖它,则该类将是抽象的)。但是,当构造函数或析构函数正在运行时,您可能有一个处于中间状态的对象。但是由于标准规定尝试在这种状态下虚拟调用纯虚函数会导致未定义的行为,因此编译器可以自由地不必特殊情况下的事情来使其正确,从而为实现纯虚函数提供了更大的灵 active 。特别是,编译器可以像实现非纯虚拟一样自由地实现纯虚拟(不需要特殊情况),如果您从 ctor/dtor 调用纯虚拟,编译器会崩溃或以其他方式失败。

关于c++ - 为什么从构造函数对纯虚函数的虚调用是 UB,而标准允许对非纯虚函数的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9185990/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com