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
  • 相关阅读:
    hive与hbase整合
    待重写
    hive DML
    【知识强化】第六章 总线 6.1 总线概述
    【知识强化】第五章 中央处理器 5.1 CPU的功能和基本结构
    【知识强化】第四章 指令系统 4.3 CISC和RISC的基本概念
    【知识强化】第四章 指令系统 4.2 指令寻址方式
    【知识强化】第四章 指令系统 4.1 指令格式
    【知识强化】第三章 存储系统 3.6 高速缓冲存储器
    【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器
  • 原文地址:https://www.cnblogs.com/daoluanxiaozi/p/2275520.html
Copyright © 2011-2022 走看看