C++面向对象设计
一. 组合(复合),继承,委托
1.composition(组合)has-a
1.1 组合举例:(Adapter 设计模式)
关系:

利用deque功能实现所有queue功能
template <class T>
class queue{
protected:
deque<T> c; //deque 是两端可进出,queue是末端进,前端出
public:
bool empty() const{ return c.empty;}
size_type size() const{ return c.size();}
reference front() { return c.front(); }
reference back() { return c.back(); }
void push(const value_type& x) { c.push_back(x); }
void pop() { c.pop_front(); }
};
1.2 构造与析构
构造由内而外:
container的构造函数先调用component的默认构造函数,再执行自己
如果默认构造函数不符合要求,需自己在外部构造函数写明调用哪个内部构造函数
析构由外而内:
container的析构函数先执行自己,再调用component的析构函数
2. delegation(委托): composition by reference
以handle/body(Pimpl)设计模式为例
关系图:
存指向另一个对象的指针,composition by reference

// handle String.hpp
class StringRep;
class String {
public:
String();
String(const char* s);
String(const String& s);
String &operator=(const String& s);
~String();
. . . .
private:
StringRep* rep; // pimpl
}; //body String.cpp
#include "String.hpp"
namespace {
class StringRep {
friend class String;
StringRep(const char* s);
~StringRep();
int count;
char* rep;
};
}
3 继承 (is-a)
3.1 举例:
struct _List_node_base
{
_List_node_base* _M_next;
_List_node_base* _M_prev;
};
template<typename _Tp>
struct _List_node
: public _List_node_base
{
_Tp _M_data;
};
3.2 构造与析构

构造函数由内而外,析构函数由外而内;
derived的构造函数先调用base的默认构造函数,再执行自己
derived的析构函数先执行自己,再调用base的析构函数
base的析构函数必须为virtual,否则可能出现只调用基类析构函数,而未调用派生类析构函数的情况
二 虚函数与多态
1. 虚函数
函数的继承,继承的是调用权。
非虚函数:不希望子类重新定义(override 复写)它
虚函数:希望子类重新定义(override)它
纯虚函数:希望子类一定要重新定义它,你对他无定义。
class Shape {
public:
virtual void draw( ) const = ; //纯虚函数
virtual void error(const std::string& msg); //虚函数
int objectID( ) const; //非虚函数
...
};
class Rectangle: public Shape { ... };
class Ellipse: public Shape { ... };
2 以开文件为例
设计模式 Template Method (MFC即为典型的 Application framework)
共有部分在设计父类时事先实现;其他无法决定其定义的(如本例中如何读文件内容)
Serialize声明为虚函数,使其延缓到子类再重新定义,决定其具体的实现。
子类对象调用父类函数,流程如图中所示
上述过程模拟代码:
#include <iostream>
using namespace std;
class CDocument{
public:
void OnFileOpen(){
cout << "dialog..." << endl;
cout << "check file status..." << endl;
cout << "open file..." << endl;
Serialize();
cout << "close file..." << endl;
cout << "update all views..." << endl;
}
virtual void Serialize(){};
}; class CMyDoc : public CDocument{
public:
virtual void Serialize(){
//只有应用程序自身知道如何读取自己的文件
cout<< "CMyDoc::Serialize"<<endl;
}
}; int main(){
CMydoc myDoc;
myDoc.OnFileOpen();
}
C++面向对象设计的更多相关文章
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- UML类图与面向对象设计原则
1. 引言 从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...
- 面向对象设计之SRP(单一职责)原则
SRP设计原则面向对象类设计的第一个原则,最优先考虑的因素 一个类应该有且仅有一个职责.所谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因 引起该类变化,其 ...
- day24:面向对象设计与面向对象编程、类和对象
一.三大编程范式: 面向过程: 面向函数: 面向对象: 二.程序的进化论: 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定 ...
- 【转】面向对象设计的SOLID原则
S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...
- 6. javacript高级程序设计-面向对象设计
1. 面向对象设计 1.1 理解对象 1.1.1 属性类型 (1). 数据属性:相当于对象的字段,包含一个数据值的位置,在这个位置可以读取和写入值.数据属性中有4个描述其行为的特性: l [[Conf ...
- 【OOAD】面向对象设计原则概述
软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity) ...
- 面向对象设计的SOLID原则
S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...
- 面向对象设计SOLID五大原则
转载自:码农社区,http://w3croom.com/read.php?tid-4522.html 今天我给大家带来的是面向对象设计SOLID五大原则的经典解说. 我们知道,面向对象对于 ...
- C++ 设计模式2 (面向对象设计原则)
1. 变化是复用的天敌! 面向对象设计的最大优势在于 : 抵御变化 2. 重新认识面向对象 理解隔离变化: 从宏观层面来看,面向对象的构建方式更能适应软件的变化, 能将变化所带来的影响减为最小. 各司 ...
随机推荐
- css 简单的 before after 笔记
元素::first-line 段落得第一行样式 元素::first-letter 第一个字母 元素::first-before { content:“mayufo”; } contentd的内容插 ...
- easyui dialog遮罩层
当dialog在一个iframe里时,此dialog的遮罩层也会只覆盖这个iframe,要想覆盖整个页面,就把dialog写到最外层的父页面中去,此时dialog的遮罩层会自动覆盖整个页面,若需要从子 ...
- 第三百四十天 how can I 坚持
感觉还是要制定个计划,做不做不到是一回事,但是得制定.目标,一年时间进小米,加油,fordream 计划好好想想,技不在多,精就好. 晚上写了写杨辉三角,都不记得什么是杨辉三角了. 人言落日是天涯,望 ...
- 简单版问卷调查系统(Asp.Net+SqlServer2008)
1.系统主要涉及以下几个表 问卷项目表(Q_Naire) 问卷题目表(Q_Problem) 题目类型表(Q_ProblmeType) 题目选项表(Q_Options) 调查结果表(Q_Answer) ...
- 2d网络游戏的延迟补偿(Lag compensation with networked 2D games)
http://gamedev.stackexchange.com/questions/6645/lag-compensation-with-networked-2d-games ——————————— ...
- OWA修改密码注意事项
Exchange搭建参考 http://yuelei.blog.51cto.com/202879/76302 http://543925535.blog.51cto.com/639838/d-37/p ...
- css3 动画demo
1)http://www.yyyweb.com/demo/css-cokecan/inner.html 2)页面切换效果demo http://www.yyyweb.com/demo/page-tra ...
- arrayObj.splice(start, deleteCount, [item1[, item2[, . . . [,itemN]]]])
测试方法 function test(){ var arr = [0,1,2,3]; arr.splice(1,1,'a');//case console.dir(arr); } case1: arr ...
- RecyclerView 下拉刷新上拉加载
步骤: 首先直接定义一个XRecyclerView继承RecyclerView,重写他的三个构造方法. init(Context mContext)方法用来初始化底部加载的view 回到XRecycl ...
- JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法(转)
原文:JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法 jquery-easyui是一个基于jquery的图形界面插件,利用easyui可以创建很多好看的网页界面 ...