原因在于:Cat::Cat(string name) : Pet(name)中后半部分“: Pet(name)”是初始化列表(不是继承关系),意思是,你对Pet的name初始化成传入的string name,而“Cat(string name)”中的name是形参,从头到尾,都未对class Cat中的name进行赋值,经过调试发现其值为“NULL”。所以下面按照初始化列表的思路给你改了下:
#include <iostream>
#include <string>
using namespace std;
class Pet
{
public:
Pet(string name);
~Pet();
static int GetCount();
virtual void Play() = 0; //声明为抽象方法,那么就不用在基类Pet中写具体实现了
protected:
string name;
private:
static int count;
};
int Pet::count = 0;
class Cat : public Pet
{
public:
Cat(string name_c); //注意命名
void Play();
protected:
string NAME_C; //注意命名
};
class Mouse : public Pet
{
public:
Mouse(string name_m);//注意命名
void Play();
protected:
string NAME_M;//注意命名
};
Pet::Pet(string name)
{
this->name = name;
count++;
cout << "有一只宠物诞生了。。。。。。^_^!叫作:" << name << endl;
}
Pet::~Pet()
{
count--;
cout << "有一只叫作" << name << "的宠物挂掉了。。。。。。T_T!让人无比的心痛!!!" << endl;
}
Cat::Cat(string name_c) : Pet(name_c),NAME_C(name_c) //初始化列表增加对NAME_C的初始化
{
;
}
void Cat::Play()
{
cout<<NAME_C << " 在玩儿毛线球^_^" << endl; //注意输出的变量
}
Mouse::Mouse(string name_m) : Pet(name_m),NAME_M(name_m) //初始化列表增加对NAME_M的初始化
{
;
}
void Mouse::Play()
{
cout << NAME_M << " 在打洞。。。。。。^_^" << endl; //注意输出的变量
}
int Pet::GetCount()
{
return count;
}
int main()
{
Pet *cat = new Cat("Tom_3号");
Pet *mouse = new Mouse("Jerry_3号");
cat->Play();
mouse->Play();
delete cat; //删除new
delete mouse; //删除new
return 0;
}
程序有两个比较大的问题:
1. 命名混乱,子类和父类的成员函数命名一样,输出到底是父类的name还是子类的name,尤其还将name定义成static,这样容易造成代码阅读不清晰;
2. new一定要跟delete配对,不配对造成内存溢出。