zoukankan      html  css  js  c++  java
  • C++ 纯虚基类函数=0 delete 纯虚基类

    今天在写纯虚类的时候,遇到了两个问题现在特意记录下来,目的是以后好避免再犯

    • 在写纯虚类的函数头文件时候,声明纯虚函数的时候忘记标记"=0"
      • “=0”这个操作在虚函数中有2层意思:
        • 有的朋友误解这是返回值为0的意思,但是它并不是,它仅表示的是这个是个纯虚函数,是个抽象函数,没有实现
        • 这个类的继承类里面必须要实现这个函数。
     1 //animal.h
     2 class Animal//这里的这个类他是个纯虚类,不能被实例化
     3 {
     4    public:
     5    Animal() {}
     6    virtual void eat()=0;//这个函数没有实现,但是在继承类中必须要实现
     7 }
     8 
     9 class Animal
    10 {
    11    public:
    12    Animal() {}
    13    virtual void eat();//这个是普通的虚函数,有实现
    14 } 
    • 当我们写虚基类的时候,它的构造函数必须有实现:
      • 首先我们要弄清楚构造函数的调用顺序:从当前类往上找父类,一直找到最上层的父类,它是最先构造的,然后沿着继承路径依次往下构造,一直到当前类,也是就一句话:初始化基类的子对象,派生类的构造函数要调用基类的构造函数
     1  //animal.h
     2 class Animal
     3 {
     4 public:
     5   Animal() {}//这里的这个类的构造函数我们需要实现,否则编译报错
     6   virtual void eat()=0;
     7 }
     8  
     9 class Tiger:public Animal
    10 {
    11 public:
    12   Tiger() {}
    13   void eat override() {
    14   qDebug()<<"delicious!!wow";
    15 }
    16 } 
    • 当我们用delete释放虚基类指针出错。
      • 首先我们得明白析构函数的调用顺序:从当前类开始析构,析构完再沿着继承路径往上找父类 ,析构父类,再找到最上层的父类析构
      • 所以这里我们必须要保证虚基类的析构函数必须要有虚析构函数:因为虚析构函数的主要作用是表明其析构操作全部由子类的析构函数来实现。
     1  //animal.h
     2 class Animal
     3 {
     4 public:
     5   Animal() {}//这里的这个类的构造函数我们需要实现,否则编译报错
     6   virtual ~Animal() {}//这里的这个类的析构函数必须标记virtual
     7   virtual void eat()=0;
     8 }
     9 
    10 class Tiger:public Animal
    11 {
    12 public:
    13   Tiger() {}
    14   void eat override() {
    15   qDebug()<<"delicious!!wow"16 }
    17 } 
    18 
    19 //Client mian.cpp
    20 int main(int argc, char *argv[])
    21 {
    22   QCoreApplication a(argc, argv);
    23   Animal* ani=new Tiger();
    24   ani->eat ();
    25   delete ani;//如果上面析构函数不标记virtual,这里会报错
    26 }   

    以上笔记总结如有错误,请指正!谢谢

    不积跬步,无以至千里; 不积小流,无以成江海.
  • 相关阅读:
    (转)分布式系统原理
    Java常用排序
    19.Java5同步集合类的应用
    18.Java5阻塞队列的应用
    17.Java5的Exchanger同步工具
    16.Java5的CountDownLatch同步工具
    15.Java5的CyclicBarrier同步工具
    14.Java5的Semaphere同步工具
    13.Java5条件阻塞Condition的应用
    Docker部署JavaWeb项目实战
  • 原文地址:https://www.cnblogs.com/ax0409/p/13712992.html
Copyright © 2011-2022 走看看