复杂的抽象类

来源:互联网 发布:移动数据闲时流量包 编辑:程序博客网 时间:2024/05/16 12:54
#include <iostream>
using namespace std;
class animal
{
  public:
  animal(int);
  virtual ~animal(){cout<<"析构动物..\n";}
  virtual int getage() {return itsage;}
  virtual void sleep()=0; //声明6个纯虚函数
  virtual void eat()=0;
  virtual void propagate()=0;
  virtual void move()=0;
  virtual void body()=0;
  virtual void show()=0;
  private:
  int itsage;
};
animal::animal(int age):itsage(age) 
{
  cout<<"创建动物...\n";
}
class Mammalia:public animal //派生了另一个抽象类哺乳动物类
{
  public:
  Mammalia(int age):animal(age){cout<<"创建哺乳类...\n";}//子类在构造自己的同时也要构造基类部分 
  virtual ~Mammalia(){cout<<"析构哺乳类...\n";}
  virtual void propagate(){cout<<"哺乳类是胎生动物,通过胚胎来繁殖后代。\n";}
  //该类仅仅覆盖了基类的繁殖方法propagate()
};
class bird:public animal //鸟类将动物类的6个纯虚函数全部覆盖,因此该类不是抽象类
{
  public:
  //子类在构造自己的同时也要构造基类部分
  bird(int age):animal(age){cout<<"创建鸟类...\n";}
  virtual ~bird(){cout<<"析构鸟类...\n";}
  virtual void sleep(){cout<<"鸟类喜欢站着睡觉。\n";}
  virtual void eat(){cout<<"极个别鸟类吃肉,其他都是吃素。\n";}
  virtual void propagate(){cout<<"鸟类是卵生动物,通过排卵来繁殖后代.";}
  virtual void move(){cout<<"鸟类可以飞...\n";}
  virtual void body(){cout<<"鸟类体表被覆羽毛,前肢变为翼!";}
  virtual void show(){cout<<"鸟类的一般寿命为:"<<getage()<<endl;}
};
class human:public Mammalia //人类从抽象类--哺乳动物类派生而来
{
  public:
  human(int age):Mammalia(age){cout<<"创建人类...\n";} //子类在构造自己的同时也要构造基类部分
  virtual ~human(){cout<<"析构人类...\n";}
  //由于基类是个抽象类,因此如果要使该类起作用,那么就要将5个纯虚函数全部覆盖,这里覆盖了6个
  virtual void body(){cout<<"人类体表无毛...\n";}
  virtual void sleep(){cout<<"人类睡觉也很讲究,要在床上睡觉。\n";}
  virtual void eat(){cout<<"人类吃饭很讲究,不吃生食。\n";}
  virtual void move(){cout<<"人类靠两条腿走路。\n";}
  virtual void propagate(){cout<<"人类通过胚胎繁殖后代.\n";}
  virtual void show(){cout<<"人类的一般寿命为:"<<getage()<<endl;}
};
class pig:public Mammalia //猪类也是从抽象类--哺乳动物类派生而来
{
  public:
  //子类在构造自己的同时也要构造基类部分
  pig(int age):Mammalia(age){cout<<"创建猪类...\n";}
  virtual ~pig(){cout<<"析构猪类...\n";}
  //这里也将抽象类Mammalia的6个方法全部覆盖
  virtual void body(){cout<<"猪体表被毛...\n";}
  virtual void sleep(){cout<<"猪喜欢在烂泥里睡觉。\n";}
  virtual void eat(){cout<<"猪虽然嘴谗,但是吃饭却不讲究。\n";}
  virtual void move(){cout<<"猪用四肢走路。\n";}
  virtual void propagate(){cout<<"猪类也通过胚胎来繁殖后代.\n";}
  virtual void show(){cout<<"猪类因为要被人宰了吃,所以一般寿命为:"<<getage()<<"年。"<<endl;}
};
int main()
{
  animal*ph=0;   //声明一个指向动物类的指针ph
  int choice=0; //定义一个选择变量choice,并将其值赋为0,假如不赋值,那么后面的if语句将无法对其进行判断。
  bool quit=false; //声明一个布尔变量quit,将其值赋为false
  while(choice<4) //假如输入的数值小于4,循环开始
  {
    choice=0; //由于switch无法对字符进行判断,所以每循环一次后要将choice的值归0,否则的话上一次输入的字符会在witch语句块中进行无休止的重复检测
    cout<<"(1)猪类(2)人类(3)鸟类(0)退出:";
    cin>>choice;
    switch(choice)
  {
    case 1:ph=new pig(1); //选择1,创建猪类对象,并初始化猪类的私有变量itsage的值
    break;
    case 2:ph=new human(80);   //选择2,创建人类对象,并初始化人类的私有变量itsage的值
    break;
    case 3:ph=new bird(50);   //选择3,创建鸟类对象,并初始化鸟类的私有变量itsage的值
    break;       //由于哺乳动物是个抽象类,不能实例化对象,因此没有设置该类的选项
    default:quit=true;   //假如选择了其他,那么默认将quit的值赋为true
    break;
  }
  if(quit)             //假如quit的值为真
  break;             //退出while循环
  ph->show();         //用ph指针访问虚函数show,要注意,这里的show()不再是纯虚函数
  ph->eat();         //用ph指针访问虚函数eat
  ph->propagate();   //用ph指针访问虚函数propagate
  ph->move();       //用ph指针访问虚函数move
  ph->sleep();     //用ph指针访问虚函数sleep
  ph->body();       //用ph指针访问虚函数body
  cout<<"\n";
  }
  return 0;

}


PS:一个抽象基类仍然可以派生出抽象类,只要该类没有把纯虚函数全部覆盖掉,派生出的抽象类,假如

其子类没有将它的纯虚函数全部覆盖掉,那么该子类也是抽象类

假如确定某个基类的虚函数一定会被其所有的派生类覆盖掉,那么不如将其设置为纯虚函数

不要试图去创建一个抽象类的对象

原创粉丝点击