
如何理解函数的继承,不应该从内存的角度理解函数的继承,因为
函数的继承继承的是调用权,即子类可以继承父类的函数
非虚函数:不希望子类重写
虚函数:希望子类重写
纯虚函数:希望子类一定要重写,因为父类没有定义

模板方法模式
在框架中,把固定应该写的先写好,留下不确定的部分,让其称为一个虚函数,
由子类去定义,子类对象直接调用父类方法,传入隐藏的this指针,通过this
指针找到子类重写的virtual Serialize()

父类CDocument中,有一个虚函数,希望子类一定要重写(因为定义为空),
我们看到子类在第25行重写了该函数

当子类中有父类的成分,又有组合在里面,先调用哪个析构函数呢?有待测试
当子类里有父类的成分,而父类里又有组合,构造函数由内而外 ,析构由外而内

举一个实际的例子,我们同一个文件开多个窗口去观察,如果一个窗口有
变化,其他都要跟随变化,因为真正的数据只有一份,该如何设计

这是一个非常经典的解法,设计一个Subject存放数据,同时设计一个Observer
观察数据,可以让Subject拥有很多个Observer,方法是使用一个vector容器存储
Observer的指针,这就是委托,Observer可以被继承,其所有的子类都是 is-a
Observer,都可以放到 m_views 容器中,也就是有多个不同的人在看同一份数据,
Subject中,提供一个attach函数,将要参与观察的子类放到容器中,同时还应该有
注销的功能(此处没有设计),还应该有一个notify()函数,调用update()函数通知
各个观察者数据的改变,这就是观察者模式

组件模式

原型模式
如果需要一个继承体系,创建一个未来才出现的子类,应该如何设计,一个解法是后面出现的子类,在子类中创造一个静态的自己LSAT,而这个静态的自己需要被父类看到,创建的时候调用私有
的构造函数 - LandSatImage,从而调用addPrototype(this);把自己挂载上去,所有的子类都可以这样做。在子类当中,还应该准备一个函数叫做clone(),来new自己,作出一个副本,
