描述
1.定义一个类Animal,该类中包含数据成员name用来记录动物的名字,并有一个虚函数show用于显示动物的种类。
2.定义两个类Cat和Dog,都继承自Animal;包含show函数,不但要显示动物的种类(类型分别 为 cat,dog),还要显示动物的名字。
3.定义一个Tiger类,继承自Cat,包含show函数,显示动物的种类(类型为tiger)和名字。
编写主函数,在主函数中定义一个基类指针,并用这个指针指向派生类的对象,通过基类指针调用派生类的show函数,实现运行时的多态
输入
Cat类,Dog类和Tiger类对象的名字
输出
Cat类,Dog类和Tiger类对象的类型和名字
样例输入
Tom Sunny Petter
样例输出
This is a cat, and my name is Tom. This is a dog, and my name is Sunny. This is a tiger, and my name is Petter.
#pragma GCC optimize(2)
#include <iostream>
#include <string>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
class Animal
{
private:
string name;
public:
Animal(string name){this->name=name;}
virtual void show()=0;
void show_name(){cout<<", and my name is "<<name<<"."<<endl;}
virtual ~Animal(){//cout<<"delete animal"<<endl;}
};
class Cat:public Animal
{
private:
string kind;
public:
Cat(string name,string kind):Animal(name){this->kind=kind;}
void show(){
cout<<"This is a "<<kind;
show_name();
}
~Cat(){//cout<<"delete cat"<<endl;}
};
class Dog:public Animal
{
private:
string kind;
public:
Dog(string name,string kind):Animal(name),kind(kind){}
void show(){
cout<<"This is a "<<kind;
show_name();
}
~Dog(){//cout<<"delete dog"<<endl;}
};
class Tiger:public Cat
{
public:
Tiger(string name,string kind):Cat(name,kind){}
~Tiger(){//cout<<"delete tiger"<<endl;}
};
int32_t main()
{
IOS;
Animal *p;
string a,b,c; cin>>a>>b>>c;
Cat cat(a,"cat");
Dog dog(b,"dog");
Tiger tiger(c,"tiger");
p=&cat; p->show();
p=&dog; p->show();
p=&tiger; p->show();
return 0;
}
定义基类虚析构函数,基类指针派生类对象也可以进行析构。
也就是说,根据上述程序,只需要在基类animal中定义一个虚析构函数,那么animal的派生类都会依次调用析构函数,直至基类animal析构完成