Inheritance(继承),表示is-aios
non-virtual 函数:不但愿derived class 从新定义(override,复写)算法
virtual函数:但愿derived class从新定义它(override,复写)它,而且它已经有默认定义。ide
pure-virtual函数(纯虚函数):但愿derived class必定要从新定义(override)它,你对它没有默认定义。函数
class Shape{this
public:spa
virtual void draw() const = 0; //纯虚函数server
virtual void error(const std::string& msg);继承
int objectID() const; ip
};string
class Rectangle: public Shape{...};
class Ellipse: public Shape{...};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Inheritance(继承) with virtual
Template Method 模板方法模式
Application framework Application
CDocument::OnFileOpen( ){ class CMyDoc: public CDocument{
serialize( ); virtual Serialize( ) {...}
} };
main( ){
CMyDoc myDoc;
...
myDoc.OnFileOpen( );
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include<iostream>
using namespace std;
class CDocument{
public:
void OnFileOpen( ){
//这是一个算法,每一个cout输出表明一个实际动做
cout << "dialog..." << endl;
cout << "check file status ..." << endl;
Serialize( );
cout << "close file ..." << endl;
}
virtual void Serialize( ) { };
};
class CMyDoc : public CDocument{
public:
virtual void Serialize ( ){
//只有应用程序自己才知道如何读取本身的文件
cout << "重写虚函数" << endl;
}
};
int main( ){
CMyDoc myDoc( );
myDoc.OnFile( );
}
继承与复合关系下的构造和析构
委托+继承
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);
}
}
}
Observer
class Observer{
public:
virtual void update(object* sub, int value);
}