编程填空:统计动物数量

这题比较强大,开始我以为只是用第三章的知识,可是main函数里面有

Animal* c2 = new Cat;

这个语句,在没百度别人答案的情况下,我觉得应该继承问题,
当我写好之后发现c2析构的时候竟然没有调用子类的(也就是Cat的)析构函数.....原来还有虚基类的知识。。。

virtual ~Animal()
//正常情况,子类祖先类的析构函数都是虚拟的,
//这样删除祖先类指针、子类对象的时候,
//可正确同时调用子类和祖先类的析构函数
{
number--;
}

还好我学过c++.....初学者可能想放弃了,其实学过之后就会感觉也没那么难,就是规则太多容易忘..
下面是我的代码:(不看别人了,做对就行~)

#include 
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();
}
编程填空:统计动物数量_第1张图片
运行结果

你可能感兴趣的:(编程填空:统计动物数量)