c++ - 在构造和销毁期间调用虚拟方法

标签 c++ inheritance virtual-functions

在构造和销毁过程中调用虚拟方法导致编译器错误?我听说这样做很危险。

我知道如果我有一个 Class Base 定义了一个虚方法 foo(),那么 foo() 的分辨率是 <Base 的所有子类中的 strong>dynamic。因此,如果子类 Derived 覆盖了 foo(),那么 Derived::foo() 就会被调用。那么,为什么在构造/析构期间调用虚方法 会使编译器感到困惑?

从构造函数中调用它们和在构造函数外部调用它们有什么区别?

最佳答案

在构造Base()时,派生类还没有被初始化,也并不真正存在。当您调用虚方法时,您的调用将转至 Base::foo()。这不一定是错误的,但通常是出乎意料的,因此普遍禁止这样做。

类似地在销毁期间,Derived 在 ~Base() 被调用之前被销毁,因此虚拟方法调用将再次转到 Base::foo(),这又是经常出乎意料。

关于c++ - 在构造和销毁期间调用虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13459927/

相关文章:

C++ - std::vector 安全多线程

c++ - QInputDialog 参数默认值

c++ - 在模板特化和重载 C++ 方面没有得到预期的歧义

java-从列表中调用子类

c# - Entity Framework 继承和持久化列

java - 检查派生类是否有来自父类(super class)的注解

c++ - 接口(interface)与个人记录器

c++ - 为什么虚函数是私有(private)的?

c# - c#中虚函数的实际使用

c++ - 反转生成的 vtable 函数顺序(具有相同名称的函数)