继承关系中:子类可以继承父类的数据和函数。
数据继承下来会占用内存的一部分;函数继承下来可以理解为子类继承的是父类函数的调用权,子类可以调用父类的函数。(调用权第一次听说,hh)
Inheritance(继承)with virtual functions(虚函数)
non-virtual函数:你不希望derived class重新定义(override,覆写)。
virtual函数:你希望derived class重新定义(override,覆写)它,且它已有默认定义。
pure virtual函数:你希望derived class一定要重新定义(override)它,你对它没有默认定义。
class Shape{
public:
virtual void draw() const = 0; //pure virtual
virtual void error(const std::string& msg); //impure virtual
int objectID() const; //non-virtual
...
};
class Rectangle:public Shape{ ... };
class Ellipse:public Shape{ ... };
模板模式
设计一个框架提供给外部应用,有些普遍的直接实现,有些需要提供接口给外部应用自己实现,以virtual强制。
代码实现上述过程:
#include <iostream>
using namespace std;
class CDocument
{
public:
void OnFileOpen()
{
//这是个算法,每个cout输出代表一个实际动作
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();
}
Inheritance+Composition关系下的构造和析构
子类Derived既有继承又有复合的情况下,构造函数是先继承再复合。
Delegation(委托)+Inheritance(继承)
Observer(观察者模式)
同一组数据,不同的观察者所得到的呈现方式必然不一样。比如可以柱状图,饼状图,条形图。我们可以委托+继承实现。
class Subject //存放数据
{
int m_value;
vector<Observer*> m_views;
public:
void attach(Observer* obs) //将观察者依附于数据
{
m_views.push_back(obs);
}
void set_val(int value)
{
m_value=value;
notify();
}
void notify() //通知所有的观察者更新,因为数据可能发生了改变
{
for(int i=0;i<m_views.size();i++)
m_views[i]->update(this,m_value);
}
};
class Observer //观察者类可以派生出很多子类,并且实现方式不同,通过virtual保证
{
public:
virtual void update(Subject* sub,int value) =0;
};