复杂的抽象类
来源:互联网 发布:移动数据闲时流量包 编辑:程序博客网 时间: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;
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:一个抽象基类仍然可以派生出抽象类,只要该类没有把纯虚函数全部覆盖掉,派生出的抽象类,假如
其子类没有将它的纯虚函数全部覆盖掉,那么该子类也是抽象类
假如确定某个基类的虚函数一定会被其所有的派生类覆盖掉,那么不如将其设置为纯虚函数
不要试图去创建一个抽象类的对象
- 复杂的抽象类
- 复杂系统的多层抽象和产业链
- 提高系统OOP抽象以应对复杂的需求
- 高级多态(三):复杂的抽象层次结构
- 【c++程序】复杂抽象结构
- 所有软件活动包括根本任务--打造构成抽象软件实体的复杂概念结构
- 计算机组成原理第一章 研究内容 层次结构 应对系统复杂的重要方法--抽象
- 在SQLAlchemy中通过一定的抽象使用复杂SQL(SQLAlchemy官方文档节选)
- 接口的行为抽象和抽象类的行为抽象
- 0013.scala的抽象类、抽象字段、抽象方法
- scala的抽象类、抽象字段、抽象方法
- C#的抽象类和抽象方法
- 抽象类没抽象方法的例子
- Java的抽象类与抽象方法
- java的抽象类和抽象方法
- 抽象类没抽象方法的例子
- Java的抽象类和抽象方法
- 抽象类调用抽象方法的问题
- 最近很累 心情很压抑
- 观察者模式-气象站
- getopt()
- FZU - 2109 Mountain Number
- Linux input子系统分析 输入子系统核心分析
- 复杂的抽象类
- 【Leetcode】Letter Combinations of a Phone Number
- stl queue
- Dijkstra算法,单源最短路径(一个起点到各个点的最短距离)
- oracle中动态、静态注册
- Java_io体系之BufferedInputStream、BufferedOutputStream简介、走进源码及示例——10
- 策略模式-鸭子的变化
- hdoj1181(变形课,广搜)
- 《数据结构和Java集合框架第三版》读书笔记(九)平衡二叉搜索树的旋转