zoukankan      html  css  js  c++  java
  • 类的综合案例——纯虚函数与抽象类( 加强对接口与多态,以及派生类构造函数的理解 )

     注意派生类构造函数的写法。

      1 #include <iostream>
      2 
      3 using namespace std;
      4 
      5 enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown };
      6 
      7 class Animal
      8 {
      9 public:
     10     Animal() = default;
     11     Animal(int);
     12     virtual ~Animal();
     13     virtual int GetAge() const { return itsAge; }
     14     virtual void SetAge(int age) { itsAge = age; }
     15     virtual void Sleep() const = 0;                //抽象基类,有5个纯虚函数
     16     virtual void Eat() const = 0;
     17     virtual void Reproduce() const = 0;  //繁殖
     18     virtual void Move() const = 0;
     19     virtual void Speak() const = 0;
     20 private:
     21     int itsAge;
     22 };
     23 
     24 Animal::Animal(int age): itsAge(age)
     25 {
     26     cout << "Animal构造函数被调用...
    ";
     27 }
     28 Animal::~Animal()
     29 {
     30     cout << "Animal析构函数被调用...
    ";
     31 }
     32 
     33 class Mammal : public Animal
     34 {
     35 public:
     36     Mammal() = default;
     37     Mammal(int age) : Animal(age)   //将age传递给基类Animal的构造函数,使用基类的构造函数构造派生类的基类部分的成员
     38     {
     39         cout << "Mammal构造函数被调用...
    ";
     40     }
     41     virtual ~Mammal()
     42     {
     43         cout << "Mammal析构函数被调用...
    ";
     44     }
     45     virtual void Reproduce() const      //只覆盖了基类Animal的Reproduce函数,基类的其他4个纯虚函数没有重写,所以Mammal类还是一个抽象类(一个具有4个纯虚函数的抽象类)
     46     {
     47         cout << "Mammal reproduction depicted...
    ";
     48     }
     49 };
     50 
     51 class Fish : public Animal
     52 {
     53 public:
     54     Fish() = default;
     55     Fish(int age) : Animal(age)     //将age传递给基类Animal的构造函数,使用基类的构造函数构造派生类的基类部分的成员
     56     {
     57         cout << "Fish构造函数被调用...
    ";
     58     }
     59     virtual ~Fish()
     60     {
     61         cout << "Fish的析构函数被调用...
    ";
     62     }
     63     virtual void Sleep() const { cout << "Fish sleeping...
    "; }     //Fish类实现了Animal类的所有纯虚函数,所以Fish类不是抽象类
     64     virtual void Eat() const { cout << "fish eating...
    "; }
     65     virtual void Reproduce() const { cout << "fish reproducing...
    "; }
     66     virtual void Move() const { cout << "Fish moving...
    "; }
     67     virtual void Speak() const { cout << "Fish speaking...
    "; };
     68 };
     69 
     70 class Horse : public Mammal
     71 {
     72 public:
     73     Horse() = default;
     74     Horse(int age, COLOR color) : Mammal(age), itsColor(color)
     75     {
     76         cout << "Horse构造函数被调用...
    ";
     77     }
     78     virtual ~Horse()
     79     {
     80         cout << "Horse析构函数被调用...
    ";
     81     }
     82     virtual void Speak() const { cout << "Horse speaking
    "; }//由于Horse继承于Mammal,Mammal已经实现了Animal的Reproduce纯虚函数,所以horse只需实现剩余4个纯虚函数即可
     83     virtual void Sleep() const { cout << "Horse sleeping...
    "; }
     84     virtual void Eat() const { cout << "Horse eating"; }
     85     virtual void Move() const { cout << "Horse Moving...
    "; }
     86     virtual COLOR GetItsColor() const { return itsColor; }    //在继承关系中,最好将所有成员函数都声明为虚函数
     87 protected:
     88     COLOR itsColor;   //COLOR为前面定义的枚举类型
     89 };
     90 
     91 class Dog : public Mammal
     92 {
     93 public:
     94     Dog() = default;
     95     Dog(int age, COLOR color) : Mammal(age), itsColor(color)
     96     {
     97         cout << "Dog构造函数被调用...
    ";
     98     }
     99     virtual ~Dog()
    100     {
    101         cout << "Dog析构函数被调用...
    ";
    102     }
    103     virtual void Sleep() const { cout << "Dog sleeping...
    "; }     
    104     virtual void Eat() const { cout << "Dog eating...
    "; }
    105     virtual void Reproduce() const { cout << "Dog reproducing...
    "; }  //覆盖了父类Mammal的reproduce函数
    106     virtual void Move() const { cout << "Dog moving...
    "; }
    107     virtual void Speak() const { cout << "Dog speaking...
    "; }
    108 protected:
    109     COLOR itsColor;
    110 };
    111 
    112 int main()
    113 {
    114     Animal *pAnimal = nullptr;
    115     int choice;
    116     bool fQuit = false;
    117     while (fQuit == false)
    118     {
    119         cout << "(1)Dog (2)Horse (3)Fish (0)Quit: ";
    120         cin >> choice;
    121         
    122         switch (choice)         //pAnimal可以指向其任意的子类对象
    123         {                       //此处体现了类的多态性
    124         case 1:                
    125             pAnimal = new Dog(5, Brown);
    126             break;
    127         case 2:
    128             pAnimal = new Horse(4, Black);
    129             break;
    130         case 3:
    131             pAnimal = new Fish(5);
    132             break;
    133         default:
    134             fQuit = true;
    135             break;
    136         }
    137         if (fQuit == false)
    138         {
    139             pAnimal->Speak();
    140             pAnimal->Eat();
    141             pAnimal->Reproduce();
    142             pAnimal->Move();
    143             pAnimal->Sleep();
    144             delete pAnimal;
    145             cout << endl;
    146         }
    147     }
    148 
    149     return 0;
    150 }
  • 相关阅读:
    Remote procedure call (RPC) redis使用
    python Redis使用
    python rabbitMQ有选择的接收消息(exchange type=direct)或者(exchange_type=topic) 
    pyhon rabbitMQ 广播模式
    python之RabbitMQ简单使用
    python selectors模块使用
    python IO多路复用之Select
    Java多个jdk安装切换
    IDM下载器
    联想小新安装win10
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/9384987.html
Copyright © 2011-2022 走看看