C++面向对象基础(6)-虚函数与多态

虚函数

非虚函数:常规的函数,在继承时不希望子类重写(override)
int objectID() const;
虚函数:前面加了关键字“virtual”的函数,在继承时希望子类重写,但已有默认定义
virtual void error(const std::string& msg);
纯虚函数:前面加了关键字“virtual”的函数且后面有“=0”,继承是子类一定要重写,因为父类中没有默认定义
virtual void draw() const = 0;

模板方法模式:基于继承的基本代码复用技术,在一个逻辑算法骨架中定义了一个或多个抽象操作,将这些操作延迟到子类中实现。
虚函数就是实现template method的一种手段,如下图例子:

CMyDoc继承了CDocument,在父类CDocument中OnFileOpen里的Serialize()方法没有实现,而是在子类中采用虚函数实现的。

举例

委托+继承
问题描述:一份数据有多种不同的呈现状态,当数据改变时,每种呈现也相应改变,如用户界面里的多图窗。
解决:一个数据类Subject,多个呈现类Observer,Subject类与Observer类是委托关系,Observer类可以被继承,子类中实现具体的呈现方式

class Subject
{
  int m_value;
  vector<Observer*>m_views;  // 准备容器,可以指向多个observer
  public:
    void attach(Observer* obs)  // 注册,就是把所有的observer放进容器,后续也可以设计注销的方法
    {
       m+views.push_back(obs);
    }
    void set_val(int value)
    {
      m_value = value;
      notify();
    }
    void notify()   // 通知所有observer更新数据
    {
      for(int i = 0; i<m_views.size(); ++i)
        m_views[i]->update(this, m_value);
    }
};

class Observer  // 可以被继承,具体在子类中实现
{
  public:
    virtual void update(Subject* sub, int value = 0);
};

posted @ 2022-04-13 17:43  Stella77  阅读(50)  评论(0)    收藏  举报