//############################################################################
/*
* 多态
*/ // 常见的动态多态
// 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++进阶--静态多态的更多相关文章

  1. 【C++模版之旅】静态多态的讨论

    说到面向对象特性之一“多态”,以我的水平已经说不出太多新意了.相信很多程序员代码K多了,做梦都在“多态中”运行着.常规的多态是C++语义内置支持的一种特性,通过虚函数可以实现这个特性,为了后面以示区别 ...

  2. C++中的静态多态和动态多态

    C++中的静态多态和动态多态 今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式( ...

  3. c++ 宏多态 动态多态和静态多态(转载)

    转载出处:通道 多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形.在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关 ...

  4. C++ //多态 //静态多态:函数重载 和 运算符重载 属于静态多态 ,复用函数名 //动态多态:派生类和虚函数实现运行时多态

    1 //多态 2 //静态多态:函数重载 和 运算符重载 属于静态多态 ,复用函数名 3 //动态多态:派生类和虚函数实现运行时多态 4 5 //静态多态和动态多态的区别 6 //静态多态的函数地址早 ...

  5. c++ 静态多态与动态多态

    多态polymorphism是指具有多种形态的情况,它能根据单一的标记关联不同的行为.多态是面向对象程序设计的基础.在面向对象程序设计中的多态是一种运行时的多态.C++中有两种多态,称为动多态(运行时 ...

  6. C++进阶--静态初始化的惨败

    /* Initialization Fiasco 一个会使程序崩溃的细微的问题 */ // 不同文件的编译顺序是不确定的 // 如果一个文件依赖另一个文件的对象先初始化,可能出现问题 // 解决方法: ...

  7. Java面向对象之多态的静态和动态实现

    简单而言: 静态多态:即为重载,方法的重载 动态多态:即为重写/覆盖,方法的重写

  8. C++的多态总结(静态&动态)

    什么是多态 顾名思义就是同一个事物在不同场景下的多种形态. 静态多态 我们以前说过的函数重载就是一个简单的静态多态,静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合 ...

  9. [转帖]Java中重写和重载与多态的关系

    Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67  收藏 更多 分类专栏: java进阶之路   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

随机推荐

  1. Unity 3D动态修改Shader状态,使物体透明等等

    Unity动态改Shader状态透明 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  2. Java当中的JVM

    Java当中JVM 01 在使用控制面板时的实质: Hello.java使用javac,然后变成为Hello.class通过运行java这个命令,在类加载器中(含有加载,验证,准备,解析,初始化,使用 ...

  3. linux cent os 6 的安装

    目前,只有图片,没有仔细写,这是在虚拟机内的安装:

  4. Python数据结构——栈的列表实现

    用Python内置的列表(list)实现栈,代码如下: import os os.chdir("E:\\Python_temp") class Stack: def __init_ ...

  5. JAVA中native方法调用

    在Java中native是关键字.它一般在本地声明,异地用C和C++来实现.它的声明有几点要注意:1)native与访问控制符前后的关系不受限制.2)必须在返回类型之前.3)它一般为非抽象类方法.4) ...

  6. 《DSP using MATLAB》Problem 5.32

    代码: function [y] = ovrlpadd_v3(x, h, N) %% Overlap-Add method of block convolution %% -------------- ...

  7. html2canvas用法的总结(转载)

    最近做h5网页,有个功能是用户能长按页面保存为图片,在我们理解就是网页要生成图片然后再让用户长按保存,然后就发现了html2canvas这个框架了,效果挺不错了,但是有几个坑说一下(用的最新版): h ...

  8. Cassandra Demo--Python操作cassandra

    ================================================================ 创建keyspace和table CREATE KEYSPACE ex ...

  9. Swift 属性 函数

    如今看cocoachina上得文章越来越有质量了,果断分享一下  原文: http://www.cocoachina.com/newbie/basic/2014/0611/8773.html 函数 函 ...

  10. PowerDesigner V16.5 安装及汉化

    一.power designer是什么以及是干什么的? power designer是能进行数据库设计的强大的软件,是一款开发人员常用的数据库建模工具.分别从概念数据模型(Conceptual Dat ...