//############################################################################
/*
* 多态
*/ // 常见的动态多态
// 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. 【转&改进】Linux MPI 单机配置

    MPI的全称是Message Passing Interface即标准消息传递界面,可以用于并行计算.MPI有多种实现版本,如MPICH, CHIMP以及OPENMPI.这里我们采用MPICH版本. ...

  2. [LeetCode&Python] Problem 888. Fair Candy Swap

    Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...

  3. loadrunner笔记---一

    1.Loadrunner主要由Vugen,Controller和Analyais3部分组成 2.简述描述集合点和集合点函数 集合点可以同步虚拟用户,以便能在同一时刻执行任务,集合点函数lr_rende ...

  4. 软工实践——结对作业2【wordCount进阶需求】

    附录: 队友的博客链接 本次作业的博客链接 同名仓库项目地址 一.具体分工 我负责撰写爬虫爬取信息以及代码整合测试,队友子恒负责写词组词频统计功能的代码. 二.PSP表格 PSP2.1 Persona ...

  5. 关于 transparent rgba display:none; opacity visiblity 关于em

    关于 transparent  rgba   display:none; opacity   visiblity   display 之后不会占位. 其余都会占位 opacity 还会继承,子元素也会 ...

  6. django-dailyfresh

    Hold on ,learn by myself! redis nosql - 不支持sql语法 - 存储数据都是KV形式 - Mongodb - Redis - Hbase hadoop - Cas ...

  7. mvc core2.1 Identity.EntityFramework Core 用户Claims查看(七)

    添加角色属性查看 Views ->Shared->_Layout.cshtml <div class="navbar-collapse collapse"> ...

  8. ls -l 和du 的区别

    编程之路刚刚开始,错误难免,希望大家能够指出. 简单的来说,ls -l 显示的是实际文件(目录)大小,而du显示的是文件(目录)占用磁盘空间的大小. linux下一切皆文件. 首先,硬盘的最小存储单位 ...

  9. 4.input()

    >>> help(input) Help on built-in function input in module builtins: input(prompt=None, /) R ...

  10. Go Example--switch

    package main import ( "fmt" "time" ) func main() { i := 2 fmt.Print("write ...