C++进阶--静态多态
//############################################################################
/*
* 多态
*/
// 常见的动态多态
// Non-virtual Interface Idiom (NVI)
struct TreeNode {TreeNode *left, *right;};
class Generic_Parser {
public:
void parse_preorder(TreeNode* node) { //接口不是虚函数
if (node) {
process_node(node);
parse_preorder(node->left);
parse_preorder(node->right);
}
}
private:
virtual void process_node(TreeNode* node) { } //其中处理函数定义成虚函数
};
class EmployeeChart_Parser : public Generic_Parser {
private:
void process_node(TreeNode* node) { //派生类可以定义自己的实现
cout << "Customized process_node() for EmployeeChart.\n";
}
};
int main() {
...
EmployeeChart_Parser ep;
ep.parse_preorder(root);
...
}
// 多态的好处:干净,优雅,通用的代码
/* 满足以下几点
* 1. 基类和派生类之间是is-a关系
* 2. 基类定义一个"通用"的算法,用来给派生类使用
* 3. "通用"算法在派生类中定制
*/
/*
* 虚函数的替换方案
*/
class A {
X x; // 动态地控制执行哪个任务
/* X 可以是:
* 1. 函数指针
* 2. tr1::function, 一个归一化的函数指针
* 3. 策略类
*/
...
};
struct TreeNode {TreeNode *left, *right;};
template <typename T>
class Generic_Parser {
public:
void parse_preorder(TreeNode* node) {
if (node) {
process_node(node);
parse_preorder(node->left);
parse_preorder(node->right);
}
}
void process_node(TreeNode* node) {
static_cast<T*>(this)->process_node(node);
}
};
class EmployeeChart_Parser : public Generic_Parser<EmployeeChart_Parser> {
public:
void process_node(TreeNode* node) {
cout << "Customized process_node() for EmployeeChart.\n";
}
};
int main() {
...
EmployeeChart_Parser ep; //对外界透明,就像是真的多态一样
ep.parse_preorder(root);
...
}
// 用在库编程中比较多,比较看重虚表的开销
// 静态多态,会导致代码量膨胀,每个派生类的基类都是不同的类
// TMP Template Metaprogramming
// 将部分计算开销从运行时提前到编译时
// 也有将模板本身都叫做静态多态的,因为对于不同类型T,像<,=这样的运算符都是不同的
C++进阶--静态多态的更多相关文章
- 【C++模版之旅】静态多态的讨论
说到面向对象特性之一“多态”,以我的水平已经说不出太多新意了.相信很多程序员代码K多了,做梦都在“多态中”运行着.常规的多态是C++语义内置支持的一种特性,通过虚函数可以实现这个特性,为了后面以示区别 ...
- C++中的静态多态和动态多态
C++中的静态多态和动态多态 今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式( ...
- c++ 宏多态 动态多态和静态多态(转载)
转载出处:通道 多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形.在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关 ...
- C++ //多态 //静态多态:函数重载 和 运算符重载 属于静态多态 ,复用函数名 //动态多态:派生类和虚函数实现运行时多态
1 //多态 2 //静态多态:函数重载 和 运算符重载 属于静态多态 ,复用函数名 3 //动态多态:派生类和虚函数实现运行时多态 4 5 //静态多态和动态多态的区别 6 //静态多态的函数地址早 ...
- c++ 静态多态与动态多态
多态polymorphism是指具有多种形态的情况,它能根据单一的标记关联不同的行为.多态是面向对象程序设计的基础.在面向对象程序设计中的多态是一种运行时的多态.C++中有两种多态,称为动多态(运行时 ...
- C++进阶--静态初始化的惨败
/* Initialization Fiasco 一个会使程序崩溃的细微的问题 */ // 不同文件的编译顺序是不确定的 // 如果一个文件依赖另一个文件的对象先初始化,可能出现问题 // 解决方法: ...
- Java面向对象之多态的静态和动态实现
简单而言: 静态多态:即为重载,方法的重载 动态多态:即为重写/覆盖,方法的重写
- C++的多态总结(静态&动态)
什么是多态 顾名思义就是同一个事物在不同场景下的多种形态. 静态多态 我们以前说过的函数重载就是一个简单的静态多态,静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合 ...
- [转帖]Java中重写和重载与多态的关系
Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67 收藏 更多 分类专栏: java进阶之路 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
随机推荐
- 20155219&20155224 《信息安全系统设计基础》实验一 开发环境的熟悉
实验内容 实验两人一组,最多三人一组 可以使用自己的笔记本,也可以使用实验室台式机 使用实验箱作为超级终端. 实验中学到的知识点 交叉编译 宿主机与目标机 NFS 超级终端 file命令 实验步骤 实 ...
- 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...
- mask-code-python
tf.sqeeze: 给定张量输入,此操作返回相同类型的张量,并删除所有尺寸为1的尺寸. 如果不想删除所有尺寸1尺寸,可以通过指定squeeze_dims来删除特定尺寸1尺寸.如果不想删除所有大小是1 ...
- tomcat配置https–采用JDK自带的keytool工具生成证书
转自:http://blog.csdn.net/huangxinyu_it/article/details/41693633 有关http与https的区别请看<浅谈http与https的区别( ...
- [codeforces Mail.Ru Cup 2018 Round 1 D][ xor 操作]
http://codeforces.com/contest/1054/problem/D 题目大意:一个序列a1 a2...an,可以对若干个元素进行取反,使所得的新序列异或和为0的区间个数最多. 题 ...
- HTML表格元素
学习要点: 1.表格元素总汇 2.构建表格解析 一.表格元素总汇 表格的基本构成最少需要三个元素:<table>.<tr>.<td>,其 ...
- DOM 中的 id 属性会往全局变量中添加 id 值的变量
一直没注意到这个坑,今天看<你不知道的 JavaScript>中提到了,今后需要注意. <!DOCTYPE html> <html> <head> &l ...
- Eclipse和Intel idea的常用技巧
使用Eclipse的几个必须掌握的快捷方式 “工若善其事,必先利其器”,感谢Eclipse,她 使我们阅读一个大工程的代码更加容易,在阅读的过程中,我发现掌握几个Eclipse的快捷键会使阅读体验 ...
- 有关vuex的问题
在引入mapMutations时报错,解决方法: 1:npm install --save-dev babel-plugin-transform-object-rest-spread 2:在packa ...
- execve函数的介绍与使用
#include<stdio.h> #include<unistd.h> int main() { char *filename[]={"./BP",NUL ...