#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;
}