nheritance(继承),表示"is a",常搭配virtual function(虚函数)使用。
//关于子类父类函数的一些理解
(1). non-virtual函数:你不希望derived class重新定义(override,覆盖)它。
(2). virtual函数:你希望derived class重新定义,而且你对这个函数有默认定义。
(3). pure virtual(纯虚)函数:你希望derived class一定要重新它,你对它没有默认定义。
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{...};
//矩形可继承shape
class Ellipse:public Shape{...};
//Ellipse也可继承Shape
#include <iostream>
using namespace std;
class CDocument
{
publid:
void OnFileOpen()
{
//用cout代表通用的功能。
cout << "dialog..." << endl;
cout << "check file status.." << endl;
cout << "open file..." << endl;
Serialize();
cout << "close file..." << endl;
cout << "updata all views..." << endl;
}
virtual void Serialize() { };
};
class CMyDoc : public CDocument
{
public:
virtual void Serialize()
{
//只有程序本身才知道如何读自己的文件格式
cout << "CMyDoc::Serialize() << endl;
}
};
(1). 不一定
(2). 构造,先Component,再Base,最后Derived
析构,与上面相反
功能最强大的,Delegation(委托) + Interitance(继承)
class Subject
//放数据的class
{
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_values[i]->update(this, m_value);
}
};
class Observer
//展示数据的class,即窗口,作为父类,其子类就是各种各样的展示方式
{
public:
virtual void update(Subject* sub, int val)
};
就是文件有一份,窗口有四个,就是一种文件有四种表现形式,那么存数据和展示数据的class之间应该有什么样的关系呢