【问题标题】:Indirect call of virtual function from Destructor从析构函数间接调用虚函数
【发布时间】:2011-01-30 10:26:48
【问题描述】:

让我声明一下:我对构造函数或析构函数中的虚函数调用有清晰的了解。

在下面的代码中,我试图避免虚拟析构函数仅用于实验目的。

现在我的问题是:

在 main 中,对 Destroy fun 的调用调用了正确的虚函数。 我希望对 Destroy Function 的任何调用都应该调用正确的虚拟乐趣。

但是放置在 Base 析构函数调用中的同一个 Destroy 函数是 Base 虚函数。

这与静态绑定或编译器优化有关吗?

class Base
{
public:
      Base()
      {
      }
      void Destroy()
      {
            callVirtual();
      }
      virtual void callVirtual()
      {
            cout<<"In Base callVirtual "<<endl;
      }
      ~ Base()
      {
           cout<<"In Base Destructor"<<endl;

           Destroy();
      }
};

.

class Derived : public Base
{
   public:
           Derived()
           {
           }
           void callVirtual()
           { 
               cout"<<In Derived callVirtual"<<endl;
           } 
};

.

int main()
{
    Base *pointer = new Derived();

    pointer->Destroy();    // Calls the right callVirtual

 return 0;

}

【问题讨论】:

  • 我不明白您的示例代码与您的问题有什么关系。请你澄清一下析构函数与任何东西有什么关系?
  • @Oil Charlesworh:主要是调用 Destroy fun 调用正确的虚函数。我希望对 Destroy Function 的任何调用都应该调用正确的虚拟乐趣。这与析构函数中的静态绑定有关吗???????但是放置在 Base 析构函数调用的 Base 虚函数中的同一个 Destroy 函数
  • 你对在构造函数/析构函数中调用虚函数有一个清晰的认识,你会问这样的问题。 wtf?
  • @VJo: 可能现在我对 cotr/Dstr 中的 virtual 有了清晰的认识
  • "我对构造函数或析构函数中的虚函数调用有清楚的了解。"不,你没有。

标签: c++ object-lifetime virtual-destructor overriding


【解决方案1】:

在析构函数中,this 的动态类型是当前类的动态类型,而不是对象的原始动态类型。参见例如http://www.artima.com/cppsource/nevercall.html.

【讨论】:

  • @Oil Charlesworth:感谢您的澄清。那么他们在构造函数和析构函数中实现动态绑定是没有技巧的。
  • @Matthieu:在不属于该类的对象上调用成员函数指针将导致未定义的行为。
  • 我实际上并没有专门考虑成员函数指针。但是你确实提出了一个关于被破坏对象状态的有趣观点,我的评论没有下划线:)
  • @vrbilgi "那么在构造函数和析构函数中实现动态绑定就不需要 hack。" 不需要 hack。 这是动态绑定。
  • @OliCharlesworth "在不属于该类的对象上调用成员函数指针将导致未定义的行为。" 除非您使用演员(或其他 UB)。
猜你喜欢
  • 2021-10-20
  • 2021-05-18
  • 2018-02-08
  • 2012-01-28
  • 2020-09-29
  • 2010-10-05
  • 2016-02-29
  • 2013-09-06
相关资源
最近更新 更多