zoukankan      html  css  js  c++  java
  • 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的名称”。但是你发现没有,即便如此,抽象类里面实现纯虚方法(函数)也是多余的,用途也很有限。

    本文完。

    捣乱小子 

    更多请访问:http://daoluan.net
  • 相关阅读:
    TranslateAnimation类:位置变化动画类
    android 启动第三方程序的代码(利用ComponentName)
    android背景选择器总结
    Spinner控件怎样在subActivity中使用
    Android 自定义 spinner (背景、字体颜色)
    AndroidWebView
    android gravity属性和weight属性
    android得到控件在屏幕中的位置
    解决android自定义标题充满的问题
    android中ListView的常用样式和属性
  • 原文地址:https://www.cnblogs.com/daoluanxiaozi/p/2275520.html
Copyright © 2011-2022 走看看