一. 组合(复合),继承,委托

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++面向对象设计的更多相关文章

  1. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  2. UML类图与面向对象设计原则

    1. 引言     从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...

  3. 面向对象设计之SRP(单一职责)原则

    SRP设计原则面向对象类设计的第一个原则,最优先考虑的因素 一个类应该有且仅有一个职责.所谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因 引起该类变化,其 ...

  4. day24:面向对象设计与面向对象编程、类和对象

    一.三大编程范式: 面向过程: 面向函数: 面向对象: 二.程序的进化论: 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定 ...

  5. 【转】面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  6. 6. javacript高级程序设计-面向对象设计

    1. 面向对象设计 1.1 理解对象 1.1.1 属性类型 (1). 数据属性:相当于对象的字段,包含一个数据值的位置,在这个位置可以读取和写入值.数据属性中有4个描述其行为的特性: l [[Conf ...

  7. 【OOAD】面向对象设计原则概述

    软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity)  ...

  8. 面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  9. 面向对象设计SOLID五大原则

    转载自:码农社区,http://w3croom.com/read.php?tid-4522.html 今天我给大家带来的是面向对象设计SOLID五大原则的经典解说.       我们知道,面向对象对于 ...

  10. C++ 设计模式2 (面向对象设计原则)

    1. 变化是复用的天敌! 面向对象设计的最大优势在于 : 抵御变化 2. 重新认识面向对象 理解隔离变化: 从宏观层面来看,面向对象的构建方式更能适应软件的变化, 能将变化所带来的影响减为最小. 各司 ...

随机推荐

  1. 版本控制:SVN中Branch/tag的使用 -摘自网络

    在SVN中Branch/tag在一个功能选项中,在使用中也往往产生混淆. 在实现上,branch和tag,对于svn都是使用copy实现的,所以他们在默认的权限上和一般的目录没有区别.至于何时用tag ...

  2. dom 回到顶部(兼容IE FF Chrome)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. javascript面向对象事件继承

    继承:父类有的,子类也有.父类改变,子类也跟着变. 属性继承:      矫正this (window对象,矫正成object对象)     fn .call(this是谁,参数1,参数2...); ...

  4. cocos2d-x3.2 使用开关控制按钮 ControlSwitch

    ContolSwitch 控件起到了一个开关的作用类似于现实生活中的开关,直接上代码: .h文件 // // SwitchBtnScene.h // LSWGameIOS // // Created ...

  5. area标签circle/rect/poligon坐标

    <img src="images/02.gif" title="flower" usemap="#mm" /> <map ...

  6. iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像

    iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像 本文档基于H.264的解码,介绍读写Video Toolbox解码回调函数参数CVImag ...

  7. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  8. sql语句增删改查(转)

    一.增:有4种方法 1.使用insert插入单行数据:                  语法:insert [into] <表名> [列名] values <列值>    例 ...

  9. 用vagrant搭建一个自己的lnmp环境(一)

    用vagrant搭建自己的lnmp环境 1.工具: a.vagrant b.virtual box c.linux服务器box(此处我使用centos 7.0) 2.安装完vagrant和virtua ...

  10. 32.怎样在Swift中实现TabBar和导航视图结合的项目?

    导航栏和TabBar结合的项目,在我们平常开发中会经常看到,下面我们通过自定义的TabBar来实现一个导航和TabBar结合的Demo. 1.自定义TabBar import UIKit class ...