C++虚函数和纯虚函数(2)


书接上文......

本来只想看看书就过了,但是最近在看《设计模式》和《effective C++》这两本书,其中将到很多关于C++中封装,继承和多态的思想,所以不得不做一些笔记。

关于虚函数,在多态当中,一定要将基类的析构函数设置为虚函数并将其实现,只有这样,才能够达到按对象构造的逆序来析构对象;否则,析构的时候,只会析构基类的那一部分,那么派生类那一部分就无法成功析构了。

class shape
{
public:
    shape(){};
    virtual void draw() = 0;
    virtual ~shape(){cout << "shape destruction" << endl;}
};
class rectangle : public shape
{
public:
    rectangle(){};
    void draw(){}
    ~rectangle(){cout << "rectangle destruction" << endl;}
};
class round : public shape
{
public:
    round(){};
    void draw(){}
    ~round(){cout << "round destruction" << endl;}
};
void main()
{
    shape * s;
        s = new rectangle();
    s->draw();
    delete s;
    s = new round();
    s->draw();
    delete s;
}


§纯虚函数

在虚函数的中举了shape的例子,里面有个draw函数,但是如果具体去实现的话,draw shape?这实现起来很模糊,如果将shape基类实例化的话,就搞不清draw什么了(画出乱七八糟的东西,这不是客户需要的东西,客户需要的是具体的图形)。因此有必要在基类shape当中,将draw的定义(实现)除去,而将它的定义(实现)留给派生类。

class shape
{
public:
    shape(){};
    virtual void draw()=0;    //纯虚函数
};
class rectangle : public shape
{
public:
    rectangle(){};
    void draw()
    {
        画方形;
    }
};
class round : public shape
{
public:
    round(){};
    void draw()
    {
        画圆形;
    }
};
void main()
{
    shape * s;
    s = new rectangle();
    s->draw();
    s = new round();
    s->draw();
} 

§总结

看了上面的代码是不是很有感触,回忆起来了吧,C++里面的抽象类与java里面的接口很类似,不过C++抽象类允许有成员变量的出现。没有谁强迫你说抽象类里面的方法不能在抽象类里面实现,但是如果你确实在抽象类里面实现了,为它提供一份实现代码,C++并不会发出怨言,但是调用它的唯一途径就是“调用时明确指出其class的名称”。但是你发现没有,即便如此,抽象类里面实现纯虚方法(函数)也是多余的,用途也很有限。

本文完。

捣乱小子

优质内容筛选与推荐>>
1、linux open函数的 mode_t涵义(转)
2、Bootstrap 可视化布局--拖拽后弹窗进行编辑
3、codevs3243:区间翻转,线段树
4、[18/11/12]常量
5、XDU 1140 寻找万神(字符串匹配)


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn