zoukankan      html  css  js  c++  java
  • 15.6纯虚函数与抽象类

    纯虚函数:virtual
    1.问题的产生: 通过基类的指针删除派生类对象时只调用基类的析构函数
    例:
    class CSon{     
      public: ~CSon() {   };
    };
     
    class CGrandson : CSon{
           public: ~CGrandson() {   };
    }
     
    int main(){      
    CSon *p = new CGrandson;       delete p;       return 0;
    }

    2. 解决办法: 
    把基类的析构函数声明为virtual,派生类的析构函数 virtual可以不进行声明;
    通过 基类的指针删除派生类对象:
    首先调用 派生类的析构函数 
    然后调用 基类的析构函数 类如果定义了虚函数, 则最好将析构函数也定义成虚函数
     
     
     
    例:
    1.
    class son{
          public:
             ~son() {
            cout<<"bye from son"<<endl;
           };
    };
     
    class grandson : public son{
           public:
             ~grandson(){
       cout<<"bye from grandson"<<endl; 
      };
    };
     
    int main(){
           son *pson; 
           pson=new grandson;
           delete pson;
           return 0;
      }
     
    输出结果:  bye from son                              
      没有执行grandson::~grandson()!!!
     
    2.
    class son{
           public:
             virtual ~son() {
             cout<<"bye from son"<<endl;
       };
    };
     
    class grandson : public son{
           public:
             ~grandson(){
       cout<<"bye from grandson"<<endl;
       };
    };
     
    int main() {
       son *pson;
       pson= new grandson;
       delete pson;
       return 0;
    }
     
    输出结果: bye from grandson    bye from son
     
    抽象类:含有纯虚函数的类
    *只能作为基类来派生
    *不能创建对象
    *抽象类指针或引用->其派生类的对象
    *抽象类构造和析构函数不能调用纯虚函数
    *继承类如果把基类(抽象类)里所有的纯虚函数全部实现,继承类就不是抽象类了
    本博客作为一个入门者的自学记录,欢迎各位同行者不吝赐教。
  • 相关阅读:
    菜鸟小试牛刀。。
    RDBMS中部分关于可用性的特性
    ORA01403:no data found exception的解决小道
    oracle的存储结构(一)
    过度使用DBLINK带来的问题
    如何远程指定查询分区表的某个分区
    oracle显式游标不关闭、不关闭就再次打开会不会报错?
    Http方式下载Servlet实现
    Javazip压缩文件乱码问题
    mysql “Access denied for user 'root'@'localhost'
  • 原文地址:https://www.cnblogs.com/by-dxm/p/5450624.html
Copyright © 2011-2022 走看看