我在浏览下面的代码时有疑问。即,即使派生类的对象超出下面代码中的范围,为什么不调用派生类的析构函数:
#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 0;
}
~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 = NULL;
ClassB Obj;
Ptr = &Obj;
Ptr->set_values(10, 20);
cout << Ptr->area() << endl;
delete Ptr;
return 0;
}
答案 0 :(得分:4)
除非基类析构函数为delete
,否则不应在指向派生类对象的基类指针上调用virtual
,否则得到的是未定义行为。
基类中的析构函数需要标记为virtual
。
virtual ~ClassA(){}
答案 1 :(得分:1)
在基类中创建析构函数virtual
。否则,它会调用base的析构函数。
class ClassA
{
// ...
virtual ~ClassA()
{
cout << "base class destructor called" << endl;
}
};