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);
};

浙公网安备 33010602011771号