来自构造函数和析构函数的纯虚拟调用

nit*_*ian 17 c++ constructor destructor pure-virtual

C++标准规定禁止从构造函数或析构函数中调用纯虚函数.这是什么原因?标准为什么要设置这样的限制?

Gre*_*ill 20

在一个类的析构函数运行的地步,所有子类析构函数都已经被运行.调用由其运行析构函数的子类定义的虚方法是无效的.

在构造函数中调用虚方法时存在类似的限制.您不能为其构造函数尚未运行的子类调用虚方法.

  • @eharvest:不是这样,可以从任何非构造函数/析构函数方法调用纯虚函数.子类必须提供实现. (5认同)
  • @eharvest:当从基类调用虚函数时,调用的实际函数取决于调用函数的*instance*的类型.它不依赖于有多少个子类. (4认同)
  • 在C++中有很多未定义的东西,编译器无法检测到这些东西. (4认同)
  • 我对虚函数的评论也适用于纯虚函数. (3认同)
  • 您可以从构造函数和析构函数中调用虚方法,这在C++中具有明确定义的语义:'被调用的函数是构造函数或析构函数类中的最终覆盖,而不是在更多派生类中覆盖它.这就是调用纯虚函数导致未定义行为的原因. (3认同)
  • @eharvest:在我看来,你应该为此提出一个完整的问题,不幸的是,评论为结构化答案提供了有限的支持. (2认同)

Dav*_*rtz 5

这就是你倾倒基础或撕掉它时你不能住在房子里的原因.在构造函数完成之前,该对象仅部分构造.一旦析构函数启动,对象就会被部分破坏.纯虚函数只能在处于正常状态的对象上调用,否则需要确定调用哪个函数实现的结构可能不存在.

  • 这与非纯虚函数不同......如何? (2认同)