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
 
抽象类:含有纯虚函数的类
*只能作为基类来派生
*不能创建对象
*抽象类指针或引用->其派生类的对象
*抽象类构造和析构函数不能调用纯虚函数
*继承类如果把基类(抽象类)里所有的纯虚函数全部实现,继承类就不是抽象类了
本博客作为一个入门者的自学记录,欢迎各位同行者不吝赐教。
原文地址:https://www.cnblogs.com/by-dxm/p/5450624.html