C++继承-复合-委托

本文介绍了面向对象设计中的继承、复合和委托概念,强调了它们在C++中的应用。继承表示is-a关系,复合表示has-a关系,委托通过引用实现。还探讨了构造和析构函数在这些关系中的作用,特别是虚析构函数的重要性。此外,提到了CopyOnWrite策略和Observer设计模式,展示了如何在实际编程中应用这些原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.继承Inheritance,表示is-a
struct _List_node_base
{
    _List_node_base* _M_next;
    _List_node_base* _M_prec;
};

template<typename _Tp>
struct _List_node : public _List_node_base
{
    _Tp _M_data;    
};

在这里插入图片描述
子类指向父类
继承也可以有public protected private
继承最有价值的点是和虚函数的搭配使用
在这里插入图片描述
继承下的构造和析构
父类的析构函数必须是虚函数
一个良好的习惯是只要该以后会成为父类,那么它的析构函数就需要成为虚函数不virtual

2.复合Composition

表示has-a
在这里插入图片描述
Adapter设计模式

template<class T>
//先进先出
class queue{
    ...
    
protected:
    //两段进出
    deque<T> c; //底层容器
public:
    //以下完全利用c的操作函数完成
    bool empty() const {return c.empty();}
    size_type size() const {return c.size();}
    reference front() {return c.front();}
    reference back() {return c.back();}
    //先出先出,只开放了deque的两个功能
    void push(const value_type& x){c.push_back();}
    void pop(){c.pop_front();}
}

在这里插入图片描述
在这里插入图片描述

抽象出Composition关系
构造由内而外,首先调用里面的deque的默认构造函数
析构是先析构自身,再调用deque的析构函数

生命周期:同时

3.委托Delegation

Composition by reference.

//file 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  存在一个指针指向StringRep
};

在任意一个时间点,都可以使用StringRep,委托给StringRep

//file String.cpp
#include "String.hpp"
namespace{
    class StringRep{
        friend class String;
        StringRep(const char* s);
        ~StringRep();
        int count;
        char* rep;    
    };
}
String::String(){...}
...

左边对String的实现永远交给StringRep,而它只开放拷贝构造赋值
point to implementation 指针指向具体实现 (Handle、Body)
设计手法:左边对外不变,右边对类的实现(就可以任意切换)【编译防火墙】

在这里插入图片描述
生命周期:先有String,需要用的时候才有StringRep

在这里插入图片描述
有String a ; String b;String c;
同时指向StringRep,StringRep里面使用引用计数,共享同一个Hello

Copy On Write概念
当a想要改变rep里面的值时,那么rep就拷贝构造出一份出来,让a单独地改动
b,c依旧共享rep

4.继承+复合关系下的构造和析构

在这里插入图片描述

5.委托+继承
class Subject
{
    //真正的data位置
    int m_value;
    vector<Observer*> m_views; //委托delegation
public:
    //注册观察者
    void attach(Observer* obs)
    {
        m_views.push_back(obs);
    }
    void set_val(int value)
    {
        m_value = value;
        notify();    
    }
    //通知所有观察者,更新value
    void notify()
    {
        for(int i = 0;i < m_views.size();++i)  
            m_view[i]->update(this,m_value);  
    }
}

Observer,让Subject可以拥有多个Observer
就像ppt一样

在这里插入图片描述
像上图中就是有四个Observer在观察同一个矩形

class Observer
{
public:
    virtual void update(Subject* sub,int value)=0;
};//Observer可以被继承

在这里插入图片描述

–学习自侯捷老师

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮客pike

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值