C++类功能扩展预留五招
第一招虚函数
通过派生类来进行功能扩展是基本的面向对象的方式,这种方式大如下:
class base
{
public:
virtual ~base(){}
virtual void fun()
{
cout << "基本功能" << endl;
}
};
class derive:public base
{
public:
void fun()
{
cout << "扩展功能" << endl;
}
};
这种方式下,基类通过声明虚函数,让派生类来覆盖,最后通过多态来实现扩展功能。这种方式的最大的缺点是基类的编写者一般很难确定虚函数的功能究竟要实现到什么程度,如果有一天突然发现一个虚函数的功能要进行扩张(或收缩),那么所有从这个基类派生的类都要进行编译。这种方式的另一个缺憾是。功能的扩展不能在运行时设定。
第二招组合
通过组合方式来为类的功能扩展留下余地的方式,要比通过继承的方式在耦合方面要松的多。就是把上面的虚函数所要委托给一个其它的类。这种方式大体如下:
class action
{
public:
virtual void fun()
{
cout << "基本功能" << endl;
}
};
class exAction:public action
{
public:
virtual void fun()
{
cout << "扩展功能" << endl;
}
};
class app
{
public:
app():paction(NULL){}
virtual ~app(){}
virtual void fun()
{
if(paction)
paction->fun();
}
void setActoin( action* action_)
{
paction = action_;
}
private:
action* paction;
};
在这个例子中,类app把它的功能委托给了类action。这样一来,类app就和它的功能进行了解藕。解藕后的类app现在可以在运行时进行功能设定了。通过组合的方式虽然解藕了也能进行功能的运行时设定了。但却明显地不如第一种方式效率高。
第三招函数指针成员
通过函数指针成员方式,可以提高效率。这种方式大体如下:
class app
{
public:
app():pfun(NULL){}
virtual ~app(){}
typedef void(*FUN)();
void setFun(FUN fun_)
{
pfun = fun_;
}
virtual void fun()
{
if( pfun)
pfun();
}
private:
FUN pfun;
};
第四招成员模板函数
通过为类预留一个成员模板函数,而为类的使用者留下扩展的余地。这种方式简捷、干练。遗憾的是这种方式不能用在动态方面上。这种方式大体如下:
class app
{
public:
app(){}
virtual ~app(){}
template <class T>
void fun( T& t_)
{
cout << "基本功能" << endl;
}
};
template < >
void app::fun(int & t_)
{
cout << "扩展功能" << endl;
}
这种方式还能依偏特化的形式进行,具体请参考我的另一篇blog《让后门能够偏特化》。使用这种方式最奇妙的是声明一个模板构造函数来扩展类的构造功能。
第五招模板基类
上面的几种方式都是针对一个要进行开发的类为这个要开发的类留下扩展余地。那么能不能让要开发的类用来扩展任意的已开发好的类的功能呢?这就是第五招模板基类。这种方式大体如下:
template < class T>
class exApp:public T
{
public:
void fun()
{
cout << "扩展功能" << endl;
}
};
现在我们可以方便的把类exApp的功能添加到任意的其它的类上了。这种扩展方式的功能非常强悍,它甚至引出一个专门的编程方式:“基于策略的编程”。
详见《C++程序设计就思维》。
原文转自:http://blog.csdn.net/guanwl/article/details/2358073
原作者为 guanwl。请尊重原作者版权
转载于:https://www.cnblogs.com/LonelyEnvoy/p/5943596.html
C++类功能扩展预留五招相关推荐
- 5图片展示_做跨境电商想拍出爆款产品图片,我只用这五招
大家好! 有人认为"做电商,就是卖图片",图片做的好,才是王道! 当消费者点开产品详情页,能够促成转化的,80%来自于产品图.图片是买家对你的的第一印象,这关系到买家是否有意向点击 ...
- 扩展坞可以把手机投到显示器吗_连接手机与屏幕的桥梁,ORICO多功能扩展坞体验...
随着近几年来手机行业的发展以及手机厂商的推动,Type-C接口已经逐渐成为了手机的标配.相比于传统的Micro USB接口来讲,Type-C不仅可以正反面插入,同时它能够承载的数据传输量也有成倍的 ...
- JavaGUI:多功能计算器(五)--Swing实现双语数据包+菜单切换(完整源码+EXE下载)
JavaGUI:多功能计算器(五)–Swing实现双语数据包+菜单切换(完整源码+EXE下载) 本文资源下载: 程序源码及可独立运行的EXE文件自解压包(32bit): 多功能计算器v0.41[双语界 ...
- Android:用GSON 五招之内搞定任何JSON数组
写在前面原文 http://www.iamxiarui.com/2016/08/30/android:用gson-五招之内搞定任何json数组/ 关于GSON的入门级使用,这里就不提了,如有需要可以 ...
- usb扩展坞同时接键盘鼠标_这个多功能扩展坞,增加多个接口,笔记本秒变工作站...
原标题:这个多功能扩展坞,增加多个接口,笔记本秒变工作站 为了给笔记本电脑"减负" 越做越薄,接口也是越来越少 很多接口功能都被省去 ... 可是想接入的设备却有很多:鼠标.U盘. ...
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- C++类的使用(五)—— 多态
时隔数月,我决定把这个系列继续写下去. 多态,顾名思义,就是多种形态,多种类型. 那就奇怪了,难不成可以把一个类直接转成另一个类? 错,其实多态是指从一个继承系里的类型互相转换. 先看代码事例 #in ...
- 【转】WPF自定义控件与样式(3)-TextBox RichTextBox PasswordBox样式、水印、Label标签、功能扩展...
一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要是对文本输入控件进行样式开发,及相关扩展功能开发,主要内容包括: 基本文 ...
- 基于开源蜜罐的实践与功能扩展
0×00 前言 具有一定规模的公司都会有自己的机房,当网络规模和硬件系统到达一定程度,就需要跟进各种安全预警防护手段,而蜜罐系统就是一种常见的防护手段之一,蜜罐主要是通过在网络环境当中,用虚拟各种真实 ...
最新文章
- unix linux 命令参考,Unix/Linux 命令参考
- 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
- 代码生成工具随笔(2) ---我的生成工具
- 特斯拉第二季度生产20.6万辆电动汽车 交付20.1万辆
- Pytorch 其它有关Tensor的话题,GPU,向量化
- 30 万奖金悬赏 | CSDN 软件开发精英赛即日启动
- 单片机C语言任何位置跳转到任何指定地址 -转
- 填充图案的边界线 插件_cad如何给填充图案添加边界线
- 电脑版微信多开的三种方法
- 巨人肩膀上的迁移学习(2)---图像回归
- 用C语言写Badapple
- windows网络通讯端口
- cocos2d-x 多点触控总结
- 66、气体灭火系统的巡查内容
- java凑数算法_求教一个有关“凑数”的算法
- 都在说测试左移和右移,只有这篇文章说明白了
- Encoding常用方法,不积硅步无以至千里
- 华为特聘PPT设计师年薪百万:改变你的不是打卡,而是坚持
- 对error C2079: 'stu' uses undefined struct 'Students'的解释
- jsp科学健身交流指导平台
热门文章
- sqoop2从hdfs导入mysql_sqoop2相关实例:hdfs和mysql互相导入(转)
- php在用js_encode()转换时,实现斜杠不转义
- Java经典面试题详解:Java字符串转成list
- Java动态excel模板
- 【大牛系列教学】java商城推荐算法
- 【微信小程序企业级开发教程】如何搭建服务器(tomcat)后台
- java集群调度_Cuckoo-Schedule
- redis value最大值_Redis 的 maxmemory 和 dbnum 默认值都是多少?对于最大值会有限制吗?...
- mysql innodb 设置详解_【mysql】mysql innodb 配置详解
- mybatis 源码分析, 初始化