這題比較強大伏穆,開始我以為只是用第三章的知識,可是main函數里面有
Animal* c2 = new Cat;
這個語句舷胜,在沒百度別人答案的情況下,我覺得應該繼承問題活翩,
當我寫好之后發(fā)現c2析構的時候竟然沒有調用子類的(也就是Cat的)析構函數.....原來還有虛基類的知識烹骨。。材泄。
virtual ~Animal()
//正常情況沮焕,子類祖先類的析構函數都是虛擬的,
//這樣刪除祖先類指針拉宗、子類對象的時候峦树,
//可正確同時調用子類和祖先類的析構函數
{
number--;
}
還好我學過c++.....初學者可能想放棄了辣辫,其實學過之后就會感覺也沒那么難,就是規(guī)則太多容易忘..
下面是我的代碼:(不看別人了魁巩,做對就行~)
#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();
}
運行結果