Effective C++ 条款35
2015-06-01 10:28
411 查看
本条款作者所要表达的用意就是对于virtual成员函数的功能实现可以以其他形式代替。有的时候单纯的virtual函数可能无法满足真实编程的需要。
第一种方法:
定义一个private virtual函数,再定义一个non-virtual函数,non-virtual函数调用private virtual函数实现功能。
代码如下:
第二种方法是函数指针法。将获得健康指数的功能函数的函数指针存储为类的private数据成员。通过这种方式,可以随时通过变换函数指针使用不同类型的评估标准。同类的不同之间的健康评估标准也不一定相同。程序灵活性很大。
第一种方法:
定义一个private virtual函数,再定义一个non-virtual函数,non-virtual函数调用private virtual函数实现功能。
代码如下:
class person { public: virtual int getHealth(){return health;} private: int health; }; class child:public person { }; child c; c.getHealth();//获得健康指数 对比: class person { public: int getHealth() { getHealthValue(); } private: int getHealthValue(){return health;} int health; }; class child:public person { }; child c; c.getHealth();//获得健康指数
第二种方法是函数指针法。将获得健康指数的功能函数的函数指针存储为类的private数据成员。通过这种方式,可以随时通过变换函数指针使用不同类型的评估标准。同类的不同之间的健康评估标准也不一定相同。程序灵活性很大。
class Person { private: int health; public: typedef int(*HealthFunc)(const Person&); Person(int bh = 10, HealthFunc Func= NULL) :health(bh), Poniter(Func){} int GetHealthValue() { if (Poniter) { return Poniter(*this); } else { return 0; } } int GetBaseHealth() const { return health; } private: HealthFunc Poniter; }; class child : public Person { public: child(int bh, HealthFunc Func) :Person(bh, Func){} }; int HealthForCommonMonster(const Person& gc) { return gc.GetBaseHealth(); } int HealthForKnightBoss(const Person& gc) { return 2 * gc.GetBaseHealth(); } child d; d.GetHealthValue();
相关文章推荐
- 使用 C++ 处理 JSON 数据交换格式
- ubuntu上调过C语言画简单的函数曲线
- C++ 9.1 顺序容器-----vector、list、deque
- C++11:使用 auto/decltype/result_of使代码可读易维护
- C++ 重写重载重定义区别
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C语言前五章总结
- C++对话框创建及修改对话框属性
- 关于c++随机数的小问题
- C++ vector
- C++template
- C++对象模型之复制构造函数的构造操作
- C语言程序设计笔记(二)
- cpp algorithm
- C语言程序设计笔记(一)
- 深入理解C++中public、protected及private用法
- 小试C++
- C++对象模型
- C++设计模式---策略模式
- c\c++ 五大内存分区(excerpt)