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;}
阅读全文
0 0
- class类练习3. 純虚函数的存在 / 引用 / 兼具子类父类身份 /
- c++,父类引用指向子类对象,虚函数
- c++,父类引用指向子类对象,虚函数
- 父类引用子类的方法
- 父类的引用指向子类对象
- 父类的引用指向子类
- 子类重载父类的虚函数
- 父类引用子类对象
- 父类引用指向子类
- 父类引用指向子类
- 父类引用子类对象
- 父类引用转化为子类引用
- 兼具 List 和 Map 的“容器”类 ListMap
- 父类获取子类的class的类型
- 父类的引用指向子类的对象怎么调用子类的方法
- 父类类型的引用指向子类的对象
- 继承的时候,子类无法引用父类的属性
- 父类引用指向子类对象,为什么会调用的是子类中重新的方法
- Linux
- 浅析Object...objects
- 竖表和横表之间的相互转换
- numpy.einsum-学习笔记
- Ubuntu16.04解决/boot分区过小的方法
- class类练习3. 純虚函数的存在 / 引用 / 兼具子类父类身份 /
- 一些微信小程序项目实例
- 微信小程序教程系列
- Ubuntu命令合集(二)
- HashMap v.s. 动态规划
- 一张图看懂小程序全生态
- class 类练习4 简单交互 / 复杂交互 / list / list的遍历
- List 使用记录
- Python网络爬虫中常用第三方库总结