这两段代码 调用的析构函数为啥不一样啊?不懂


#include<iostream>
using namespace std;
class Point
{
public:
    Point(int a, int b) {
        a = x;
        b = y;
    }
 
    ~Point()
    {
        cout << "executing Point destructor" << endl;
    }
private:
    int x;
    int y;
};
class Circle :public Point
{
public:
    Circle(int a, int b, int c) :Point(a, b), radus(c) {
    }
    ~Circle()
    {
        cout << "executing Circle destructor" << endl;
    }
private:
    int radus;
};
int main()
{
    Point* p = new Circle(2.5, 1.8, 4.5);
    delete p;
    return 0;
}




#include<iostream>
using namespace std;
class Point
{
public:
    Point(int a, int b) {
        a = x;
        b = y;
    }
 
    virtual ~Point()
    {
        cout << "executing Point destructor" << endl;
    }
private:
    int x;
    int y;
};
class Circle :public Point
{
public:
    Circle(int a, int b, int c) :Point(a, b), radus(c) {
    }
    ~Circle()
    {
        cout << "executing Circle destructor" << endl;
    }
private:
    int radus;
};
int main()
{
    Point* p = new Circle(2.5, 1.8, 4.5);
    delete p;
    return 0;
}

```

  • virtual 修饰的析构函数,就是虚析构函数;

  • 虚析构函数的特点是:在父类中通过virtual 修饰析构函数后,通过 父类指针再去指向子类对象,然后通过delete 父类指针,就可以 释放掉子类对象了【也就是 先会调子类的析构函数,然后再调父类的析构函数】

  • 如果没有 virtual修饰 父类的析构函数,那通过 父类指针再去指向子类对象,然后通过delete 父类指针,只会释放父类对象,也就是只会调用父类的析构函数。

可以看看这篇:


如有帮助,欢迎采纳哈!