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
     
    抽象类:含有纯虚函数的类
    *只能作为基类来派生
    *不能创建对象
    *抽象类指针或引用->其派生类的对象
    *抽象类构造和析构函数不能调用纯虚函数
    *继承类如果把基类(抽象类)里所有的纯虚函数全部实现,继承类就不是抽象类了
    本博客作为一个入门者的自学记录,欢迎各位同行者不吝赐教。
  • 相关阅读:
    请简单介绍spring支持的常用数据库事务传播属性和事务隔离级别
    Spring Bean的作用域
    成员变量与局部变量的区别
    递归与迭代
    方法参数的传递机制 ---- 值传递
    windows phone 动画 当子控件超出父控件返回时
    把dataset 输出到 excel
    代码段
    c++ 学习纪录
    做自己的代码生成器
  • 原文地址:https://www.cnblogs.com/by-dxm/p/5450624.html
Copyright © 2011-2022 走看看