侯捷老师的虚函数和多态小结

一个类中成员函数分为3种:

non-virtual:不希望派生类对其进行重写(override).

virtual:希望派生类对其进行重写(override).

pure-virtual(纯虚函数):希望派生类一定要对其进行重写

class Shape{
public:
    virtual void draw() const =0;//pure-virtual
    virtual void error(const std::string& msg);
    int objectID() const;
    ...
};
class Rectangle:pulic Shape{...};
class Ellipse:public Shape{...};
其中继承是:数据被继承下来占用了内存,函数是继承了其调用权

打开菜单,弹出对话框,查找或者选择文件名称,按下打开,程序收到名称校对文件名称,查找文件,打开文件读出来。读的内容不一样所以其他都可以事先写好。以下是一个例子:

类中的成员函数都是以this为调用的,所以this->Serialize()在以CMyDoc的对象调用以后,传入的是myDoc的地址,最后调用了其函数,实现了具体实现

Template Method就是一种写好一个框架把可以设定的都设定好,然后再实现过程中以虚函数的方式让具体实现交由继承它的类,完成各种不同的功能。

再看一下复合的关系,继承与复合同时存在时,在创建对象的时候,又该怎么进行构造呢

下面的图很明显,我要构造派生类,我就要先构造父类,构造父类,我就要先构造其中包含的类。

而上面的时候,当我们需要构造派生类时,肯定的是派生类是最后构造的,那么父类和复合类的先后顺序是什么样的呢,在WINDOWS下利用VS2012,实现以下的函数

Inter+compositon.h

#ifndef INHER_COMPOSITION_H
#define INHER_CONMPOSITON_H
#include <iostream>
using namespace std;
class A{
public:
	A(){ cout << "A is make" << endl;}
	~A(){ cout << "~A is delete" << endl;}
};
class C{
public:
	C() { cout << "C is make" << endl;}
	~C(){ cout << "~C is delete" << endl;}
};
class B:public A{
public:
	B(){ cout << "B is make" << endl;}
	~B(){ cout << "~B is delete" << endl;}
private:
	C c;
};


#endif
test.cpp
#include <iostream>
#include "Inher+conpositon.h"
using namespace std;


int main(){
	B b;
	return EXIT_SUCCESS;
}
运行结果如下

我们发现父类先被构造,然后是复合类,然后才是子类,析构与之正好相反。

下面以一个ppt的窗口为例,来讲解委托与继承的结合:

这是利用多个窗口来显示同一份数据,左边是4个窗口都显示一样的,右边是同一份数据利用不同的图形去表示。

要实现这样的功能就必须呈现数据和储存数据的class之间要具备关联性,如果数据有变换,这些窗口都需要变化。我们用subject去储存数据,用observer去观察数据,我们让subject可以拥有很多个observer,因为我们要开出很多个窗口去观察它。

class subject{
private:
    int m_value;
    vector<observer*> m_views;//一个容器包含多个窗口,就可以实现多个窗口
public:
    void attch(observer* obs){
        m_views.push_back(obs);//谁要使用就来注册,开辟窗口
    }
    void set_value(const 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{
public:
    virtual void update(suject& sub,int value);//一个父类,让每个子类窗口的表现都可以不一样
};
这时候委托的指针和之前讲的委托不一样的是,当时只有一个string的实现,现在传过去的是一个类,这个类可以不断的被继承,实现不同种类的功能。

如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值