爲什麼在下面的示例中調用所有析構函數~D()
,~C()
,~B()
, ~A()
?當派生類的析構函數是非虛擬的時,爲什麼基類析構函數在派生對象上調用?
只有一個虛擬析構函數:A
。
下面是代碼:
#include<iostream>
using namespace std;
class A
{
public:
virtual ~A()
{
cout<<"destruct A\n";
}
};
class B:public A
{
public:
~B()
{
cout<<"destruct B\n";
}
};
class C:public B
{
public:
~C()
{
cout<<"destruct C\n";
}
};
class D:public C
{
public:
~D()
{
cout<<"destruct D\n";
}
};
int main()
{
A* ptr = new D();
delete ptr;
return 0;
}
因爲這是語言規則應該發生的事情。 – juanchopanza