第十六章 复杂的抽像类结构 简单

//7 复杂的抽像结构
/*
有的时候我们发现一个抽像类不能灵活地解决复杂的问题,比如说我们有个基类--动物,它有6个纯虚函数,睡觉sleep()
吃eat() 繁殖propagate() 运动move() 显示年龄show()和说话speak()
我们在哺乳动特类和鸟类便是从这个基类--动物类中派生出来,但是这里有一个问题,就是鸟类的哺乳动特是胎生,为了区别它们
这里就需要从一个抽像类中派生出另一个抽像类--哺浮动物类,该类仅仅覆盖掉了与鸟类不同的propagate()繁殖方法,基它五个方法保持不变,也就是说那五个被继承的函数还是纯函数,因此该哺乳动物类仍然是个抽像类

这样我们就有了两个抽像类,第一个抽像类是动物类,它派生出两个类,一个鸟类,一个哺乳动物类,在鸟类中我们将6个方法全部覆盖,这样鸟类就不再是一个抽像类
它可以创建自己的对像,但是由于哺乳动物类中只覆盖了一个propagate()繁殖方法,其它保持不变,所以它仍然是一个抽像类
或者说是一个接口类,它不能创建自己的对像,但是可以派生雎有哺乳动物类繁殖方法的其它类,比如说人类和猪类,假如人类和猪类将哺乳动物类从动物类继承过来的五个未被覆盖的纯虚函数全部覆盖掉的话
那么它们就是可以创建自己的对像,否则的话,它们仍然是抽像类
*/

#include <iostream>
using namespace std;
class Animal //动物类
{
public:
	Animal(int); //构造函数
	virtual ~Animal(){cout<<"析构动物类"<<endl;} //析构函数
	virtual int GetAge(){ return itsage; }
	virtual void Sleep() =0;    //纯虚函数 睡觉
	virtual void Propagate()=0; //繁殖
	virtual void Move()=0;      //运动
	virtual void Body()=0;
	virtual void Eat()=0;
	virtual void Show()=0;
private:
	int itsage; //私有成员itsage
};

Animal::Animal(int age):itsage(age)
{
    cout<<"创建动物"<<endl;
}

//声明一个哺乳动物类
class Mammalia:public Animal
{
public:
	Mammalia(int age):Animal(age)
	{
	   cout<<"构造了哺乳动物类"<<endl;
	}
	virtual ~Mammalia()
	{
	   cout<<"析构了哺乳动物类"<<endl;   
	}
	//重写一下繁殖方式
	virtual void Propagate()
	{
	   cout<<"哺乳动物是胎生动物,通过胚胎来繁殖后代"<<endl;
	}
};

//现在声明一个鸟类,它直接从动物类继承而来的
class Bind:public Animal
{
public:
	Bind(int age):Animal(age)
	{
	   cout<<"创建鸟类"<<endl;
	}
	virtual ~Bind()
	{
	   cout<<"析构鸟类"<<endl;
	}
	virtual void Sleep()
	{
	   cout<<"鸟类喜欢站着睡觉"<<endl;
	}
	virtual void Eat()
	{
	   cout<<"极个别鸟类吃肉,其它鸟都吃素"<<endl;
	}
	virtual void Propagate()
	{
	   cout<<"鸟类是卵生动物,通过排卵来繁殖后代"<<endl;
	}
	virtual void Move()
	{
	   cout<<"鸟类可以飞"<<endl;
	}
	virtual void Body()
	{
	   cout<<"鸟类体表被覆毛,前肢变为翼"<<endl;
	}
	virtual void Show()
	{
	   cout<<"鸟类的一般寿命是:"<<GetAge()<<"年"<<endl;
	}
};

//创建一个人类,是多哺乳动物类中继承过来的
class Human: public Mammalia
{
public:
	Human(int age):Mammalia(age)
	{
	   cout<<"创建人类"<<endl;
	}
	virtual ~Human()
	{
	   cout<<"析构人类"<<endl;
	}
	virtual void Sleep()
	{
	   cout<<"人类要在床上睡觉"<<endl;
	}
	virtual void Eat()
	{
	   cout<<"大多类人不吃生食"<<endl;
	}
	virtual void Propagate()
	{
	   cout<<"人类通过胚胎繁殖后代"<<endl;
	}
	virtual void Move()
	{
	   cout<<"人类靠两条腿走路"<<endl;
	}
	virtual void Show()
	{
	   cout<<"人类的一般寿命为:"<<GetAge()<<"年"<<endl;
	}
	virtual void Body()
	{
	   cout<<"我们双脚走路"<<endl;
	}
};

class Pig : public Mammalia
{
public:
	Pig(int age):Mammalia(age)
	{
	   cout<<"创建猪类"<<endl;
	}
	~Pig()
	{
	   cout<<"析构猪类"<<endl;
	}
	virtual void Sleep()
	{
	   cout<<"猪喜欢在烂泥里睡觉"<<endl;
	}
	virtual void Eat()
	{
	   cout<<"猪吃杂食类"<<endl;
	}
	virtual void Propagate()
	{
	  cout<<"猪也通过胚胎繁殖后代"<<endl;
	}
	virtual void Move()
	{
	  cout<<"猪靠四条腿走路"<<endl;
	}
	virtual void Body()
	{
	  cout<<"猪体表被毛"<<endl;
	}
	virtual void Show()
	{
	   cout<<"猪因为要被人吃,所以一般寿命为"<<GetAge()<<"年"<<endl;
	}
};
int main()
{
   Animal*p = 0;
   int choice = 0;
   bool quit = false;
   while(1)
   {
      cout<<"(1)猪类 (2)人类 (3)鸟类 (0)退出"<<endl;
	  cin>>choice;
	  switch(choice)
	  {
	  case 1: p = new Pig(1);
		 break;
	  case 2: p = new Human(80);
		  break;
	  case 3: p = new Bind(40);
		  break;
	  default:quit = true;
		  break;
	  }
	  if(quit == true)
	  {
	     break;
	  }
	  p->Show();
	  p->Eat();
	  p->Propagate();
	  p->Move();
	  p->Sleep();
	  p->Body();
	  cout<<endl;
	  delete p;
   }
   return 0;
}

  

原文地址:https://www.cnblogs.com/xiangxiaodong/p/2609233.html