这题比较强大,开始我以为只是用第三章的知识,可是main函数里面有
Animal* c2 = new Cat;
这个语句,在没百度别人答案的情况下,我觉得应该继承问题,
当我写好之后发现c2析构的时候竟然没有调用子类的(也就是Cat的)析构函数.....原来还有虚基类的知识。。。
virtual ~Animal()
//正常情况,子类祖先类的析构函数都是虚拟的,
//这样删除祖先类指针、子类对象的时候,
//可正确同时调用子类和祖先类的析构函数
{
number--;
}
还好我学过c++.....初学者可能想放弃了,其实学过之后就会感觉也没那么难,就是规则太多容易忘..
下面是我的代码:(不看别人了,做对就行~)
#include <iostream>
using namespace std;
// 在此处补充你的代码
class Animal{
public:
static int number;
Animal()
{
number++;
}
virtual ~Animal()
//正常情况,子类祖先类的析构函数都是虚拟的,
//这样删除祖先类指针、子类对象的时候,
//可正确同时调用子类和祖先类的析构函数
{
number--;
}
};
int Animal::number=0;//初始化
class Dog:public Animal{
public:
static int number;//狗的数量
Dog()//构造函数
{
number++;
}
~Dog()//析构函数
{
Dog::number--;
}
};
int Dog::number=0;//初始化
class Cat:public Animal{
public:
static int number;//狗的数量
Cat()
{
number++;
}
~Cat()
{
Cat::number--;
}
};
int Cat::number=0;//初始化
void print() {
cout << Animal::number << " animals in the zoo, " << Dog::number << " of them are dogs, " << Cat::number << " of them are cats" << endl;
}
int main() {
print();
Dog d1, d2;
Cat c1;
print();
Dog* d3 = new Dog();
Animal* c2 = new Cat;
Cat* c3 = new Cat;
print();
delete c3;
delete c2;
delete d3;
print();
}