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 }
  • 相关阅读:
    数据结构-树与二叉树-思维导图
    The last packet successfully received from the server was 2,272 milliseconds ago. The last packet sent successfully to the server was 2,258 milliseconds ago.
    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property
    redis学习笔记
    AJAX校验注册用户名是否存在
    AJAX学习笔记
    JSON学习笔记
    JQuery基础知识学习笔记
    Filter、Listener学习笔记
    三层架构学习笔记
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/9384987.html
Copyright © 2011-2022 走看看