c++ - C++中的析构函数概念

标签 c++ inheritance virtual-destructor

请看我下面的代码:

#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;

class ClassA
{
    protected:
    int width, height;

    public:
  void set_values(int x, int y)
  {
      width = x;
      height = y;
  }
  virtual int area()
  {
      return 100;
  }
  ~ClassA()
  {
      cout << "base class destructor called" << endl;

  }
};

class ClassB : public ClassA
{
    public :
int area()
{
    return (width * height);
}
~ClassB()
{
    cout << "derived class destructor called" << endl;
}
};
int main()
{
  ClassA *Ptr = new ClassB;
  Ptr->set_values(10, 20);
  cout << Ptr->area() << endl;
  delete Ptr;
     return 0;
} 

在上面的代码中,指针包含派生类对象的地址,所以当我删除指针时它应该调用派生类析构函数和基类析构函数,但为什么它只调用基类析构函数。如果我将基类析构函数设为虚拟,那么它同时调用派生类和基类析构函数,为什么?在虚函数的情况下,基类和派生类都具有相同的函数名,因此编译器会解析派生类中最派生的函数名,但这里的析构函数将不具有相同的名称,那么编译器将如何解析它必须调用的函数名在运行时。请解释一下如何

最佳答案

您应该使基类的析构函数虚拟,以便多态析构正常工作:

class ClassA
{
    // ...
    virtual ~ClassA()
//  ^^^^^^^
//  Add this!
    {
        cout << "base class destructor called" << endl;
    }
};

如果不这样做,在执行 delete Ptr 时会得到Undefined Behavior

if i made base class destructor as virtual then it is calling both derived class and base class destructor why?

这是常规对象销毁序列的一部分。当你销毁一个对象时,首先调用该对象类的析构函数,然后是该对象的所有非静态类成员的析构函数(以声明的相反顺序),然后是其所有基类的析构函数.

因此,虚拟分派(dispatch)在这里正确执行(当然,如果您将基类析构函数设为 virtual),第一个被调用的析构函数是实际运行的析构函数 -对象的时间类型 (ClassB)。之后,调用基类 ClassA 的析构函数以及正常析构过程的一部分。

but here the destructor won't have same name then how the compiler resolves which one it has to call during run time

析构函数是特殊的成员函数。每个类只能有一个析构函数,因此它们的名称(必须与类名相同,加上前缀 ~ 字符)无关紧要。编译器知道哪个函数是析构函数。

关于c++ - C++中的析构函数概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15292789/

相关文章:

c++ - 类具有虚函数和可访问的非虚析构函数

c++ - 从 DOS 8.3 文件名在 Windows 中打开 Unicode 文件名

c++ - GCC/XCode 等同于 _CrtCheckMemory?

c# - 与继承模型一起使用的最佳模式

c++ - 在带有虚拟析构函数的多态继承中使用enable_shared_from_this

C++ 析构函数行为

c++ - 如何在 C++ 中将用户输入验证为 double ?

c++ - 合并 K 排序列表尝试

c# - 如何防止某些方法的继承?

c++ - 没有虚拟的多态行为