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

来源:互联网 发布:淘宝什么是自主访问 编辑:程序博客网 时间:2024/05/22 07:09
#include <iostream>using namespace std;#define VERBOSEclass 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;}
原创粉丝点击