虚函数和多态(析构函数)

 

描述

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析构完成

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章