在调用Play方法后为什么名字显示不出来?求各位大佬指点一二,小白在这里先谢过...
#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);
void Play();
protected:
string name;
};
class Mouse : public Pet
{
public:
Mouse(string name);
void Play();
protected:
string name;
};
Pet::Pet(string name)
{
this->name = name;
count++;
cout << "有一只宠物诞生了。。。。。。^_^!叫作:" << name << endl;
}
Pet::~Pet()
{
count--;
cout << "有一只叫作" << name << "的宠物挂掉了。。。。。。T_T!让人无比的心痛!!!" << endl;
}
Cat::Cat(string name) : Pet(name)
{
;
}
void Cat::Play()
{
cout<<name << "在玩儿毛线球^_^" << endl; //我明明写名字name 了,为什么输出不到屏幕上???????????????
}
Mouse::Mouse(string name) : Pet(name)
{
;
}
void Mouse::Play()
{
cout << name << "在打洞。。。。。。^_^" << endl;
}
int Pet::GetCount()
{
return count;
}
int main()
{
/* {
Cat cat_1("Tom 1号");
Mouse mouse_1("Jerry 1号");
cout<<"已经诞生了"<<Pet::GetCount()<<"只宠物\n"<<endl;
cat_1.Play();
mouse_1.Play();
Cat cat_2("Tom 2号");
Mouse mouse_2("Jerry 2号");
cout<<"目前为止,已经诞生了"<<Pet::GetCount()<<"只宠物\n"<<endl;
}
cout<<"\n现在还剩"<<Pet::GetCount()<<"只宠物!!!"<<endl; */
Pet *cat = new Cat("Tom_3号");
Pet *mouse = new Mouse("Jerry_3号");
cat->Play(); //就是这里,调用play后怎么显示不出来名字?????????????????????????上面和下面结果结果一样
mouse->Play();
return 0;
}
运行结果如下:
有一只宠物诞生了。。。。。。^_^!叫作:Tom_3号
有一只宠物诞生了。。。。。。^_^!叫作:Jerry_3号
在玩儿毛线球^_^ //名字在哪呢???????????????????
在打洞。。。。。。^_^ 原因在于: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配对,不配对造成内存溢出。 matrixgadener 发表于 2019-10-12 18:25
原因在于:Cat::Cat(string name) : Pet(name)中后半部分“: Pet(name)”是初始化列表(不是继承关系),意 ...
非常感谢!谢谢您的指点!
页:
[1]