#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;
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:一个抽象基类仍然可以派生出抽象类,只要该类没有把纯虚函数全部覆盖掉,派生出的抽象类,假如
其子类没有将它的纯虚函数全部覆盖掉,那么该子类也是抽象类
假如确定某个基类的虚函数一定会被其所有的派生类覆盖掉,那么不如将其设置为纯虚函数
不要试图去创建一个抽象类的对象