class类练习3. 純虚函数的存在 / 引用 / 兼具子类父类身份 /

#include <iostream>

using namespace std;

#define VERBOSE

class Employee {
private:
  double salary;


   // 純虚函数的定义方式   函数的括号后面加上 “=0”的字样
  virtual double bonus_amount()=0;

   //   本身等价于double bonus_amount() { return 0; }
   //   純虚函数本身没有定义  并要求所有的子类函数都要定义本函数的实现方法
   //  为什么:因为很多情况下基类本身生成对象没有意义,純虚函数的类无法定义对象,还可以提高编译效率


----------


public:
  Employee(double _salary) : salary(_salary) {
  }
  void payrise() {
  #ifdef VERBOSE
    cout << "Employee(" << this << "): payrise called" << endl;
    cout << "Employee(" << this << "): salary before is " << salary <<
    endl;
  #endif

    //  #ifdef X 的作用: 如果已经定义过了X那么就执行以下的片段
    //  #endif   代表执行的片段到这里结束

  /*------------------------------------------------------------*/  

    //  #ifndef X的作用:如果还没有定义X是什么 请定义一下X
    //  #define X  [定义X的片段] 
    // #endif  :定义X的过程到这里结束,本片段常见于头文件中,防止重复定义的错误

----------


    salary += bonus_amount();
  #ifdef VERBOSE    
    cout << "Employee(" << this << "): salary is now " << salary << endl;
  #endif  
  }
};

class Manager : public Employee {

public:
  Manager(double _salary) : Employee(_salary) {
  }
  double bonus_amount() {
    return 100;
  }

};


----------


class Executive : public Employee {
public:
  Executive(double _salary) : Employee(_salary) {
  }
  double bonus_amount() {
    return 300;   - 构造函数有返回值,但是没有返回值类型
  }
};
    //如果所有对象被分成了数个等级,并且高等级的对象包含有低等级对象的全部功能
    //可以是高等级与低等级,或者是所有具有更多功能与较少功能的一种对比
    //那就可以认为是高等级是低等级的一种子类

----------


int main() {

  Executive bill_gates(1);
  bill_gates.payrise();

  Employee &leader = bill_gates;
  leader.payrise();
   // 1. 高等级由于包含了純虚函数因此无法生成对象,但是子类覆盖了父类中的函数,因此可以生成对象

   // 2. 子类向下兼容 /  包含純虚函数的类实现的方法 /
   //   由于子类是父类的一种延伸,因此只会比父类多上很多功能,向下完全兼容父类,因此是可以实现的
   //   在向下兼容,令子类对象成为父类对象的时候,作出一个引用,使得这个引用名成为指向子类对象
   //   因此生成的虽然是一个父类对象,但是本质上还是一个子类对象,执行的操作也都是子类中定义出的操作

   // 如果不用引用的方式呢?  那就会产生冲突,已经有一个对象叫做bill_gates现在另外生成一个吗?
   // 本意:令我已经有的这个子类对象也成为父类对象,不用另外生成,直接用这个就好了

   // 为什么父类现在又能生成对象了呢? 因为bill_gates对象在生成的时候已经完成了純虚函数的覆盖,因此純虚函数无法生成的问题这个时候已经不存在了

   // 关键词: 子类向下兼容 /  包含純虚函数的类实现的方法 / 引用 / 高等级对象同时兼具低等级对象的身份

----------


  Employee *company[3];

  company[0] = new Manager(1000);
  company[1] = new Executive(2000);
  company[2] = new Manager(800);

  for (int n=0; n<3; n++)
    company[n]->payrise();

  for (int n=0; n<3; n++)
    delete company[n];

  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值