借助虚析构函数编写以下程序:基类 Shape,其中定义了一个虚函数 printInfo() 。 两个派生类 Rectangle 和 Circle , 它们都重写 了 prinfInfo() 函数。使用基类指针数组来存储 Rectangle 和 Circle 对 象的地址,并依次调用它们的 printInfo() 函数。使用 delete 运算符来 删除指向 Shapes 对象的指针,需要使用虚析构函数以确保正确地调 用派生类的析构函数。
时间: 2024-02-18 22:58:56 浏览: 82
以下是程序代码:
```c++
#include <iostream>
using namespace std;
class Shape{
public:
virtual void printInfo(){
cout << "This is a shape." << endl;
}
virtual ~Shape(){};
};
class Rectangle: public Shape{
public:
void printInfo(){
cout << "This is a rectangle." << endl;
}
~Rectangle(){
cout << "Rectangle destructor called." << endl;
}
};
class Circle: public Shape{
public:
void printInfo(){
cout << "This is a circle." << endl;
}
~Circle(){
cout << "Circle destructor called." << endl;
}
};
int main(){
Shape* shapes[2];
shapes[0] = new Rectangle();
shapes[1] = new Circle();
for(int i=0; i<2; i++){
shapes[i]->printInfo();
delete shapes[i];
}
return 0;
}
```
程序首先定义了一个基类 Shape,其中定义了一个虚函数 printInfo()。然后定义了两个派生类 Rectangle 和 Circle,它们都重写了 printInfo() 函数。
程序接着定义了一个 Shape 类型的指针数组 shapes,用来存储 Rectangle 和 Circle 对象的地址。接下来使用循环依次调用它们的 printInfo() 函数,并使用 delete 运算符来删除指向 Shapes 对象的指针。需要使用虚析构函数来确保正确地调用派生类的析构函数。
程序输出结果为:
```
This is a rectangle.
Rectangle destructor called.
This is a circle.
Circle destructor called.
```
可以看到,程序成功地调用了派生类的析构函数。这是因为基类 Shape 的析构函数被声明为虚析构函数,这样在删除指向派生类对象的基类指针时就会调用派生类的析构函数。
阅读全文