• 虚函数


    1.虚函数的关键字virtual只能用在声明的地方,实现的地方不用加

    class Base{
    public:
      virtual void show();
    };
    
    void Base::show(){
      cout << "Base show" << endl;
    }
    

    2.父类的虚函数,子类继承后,在子类中也是虚函数

    class Base的虚函数show,在被class D继承后,在class D中也是虚函数,所以执行结果才是调用了class C的show方法。在class D中声明show的时候,为了增加可读性,也可以加上virtual,和不加的效果是一样的。

    #include <iostream>
    using namespace std;
    
    class Base{
    public:
      virtual void show();//{
        // cout << "Base show" << endl;
        //}
    };
    
    void Base::show(){
      cout << "Base show" << endl;
    }
    class D : public Base{
    public:
      void show(){//这里可以加上virtual
        cout << "D show" << endl;
      }
    };
    
    class C : public D{
    public:
      void show(){
        cout << "C show" << endl;
      }
    };
    
    int main(){
      C d;
      Base *pb;
      pb = &d;
      pb->show();//打印出来的是:C show
    }
    

    3.虚函数只能是类的成员函数,它就是为了实现多态而生的。不能是全局函数。

    4.静态(static)函数不可以是虚函数

    5.内联函数不可以是虚函数

    6.父类的析构函数必须是虚函数。

    动态创建父类的时候,当delete父类对象的时候,不会自动释放子类对象,造成内存泄漏;
    不是动态创建父类的时候,当delete父类对象的时候,会自动释放子类对象,不会造成内存泄漏;

    #include <iostream>
    using namespace std;
    
    class Base{
    public:
      Base(){
        cout << "create Base" << endl;
      }
       virtual ~Base(){//不加virtual的话,动态创建父类对象后,delete父类对象时,不能释放子类对象
        cout << "free Base" << endl;
      }
      virtual Base* show(){
        cout << "Base show" << endl;
        return this;
      }
    };
    
    class D : public Base{
    public:
      D(){
        cout << "create D" << endl;
      }
      ~D(){
        cout << "free D" << endl;
      }
      D* show(){
        cout << "D show" << endl;
        return this;
      }
    };
    
    int main(){
      D d;
      Base* pb = &d;
      pb->show();
    
      Base* p = new D;
      delete p;//Base类的析构函数不用virtual的话,只能释放父类对象的内存空间,不能释放子类对象的内存空间。
    }
    
  • 相关阅读:
    设计模式---策略模式
    maven+eclipse创建web项目
    【Mybatis】多对多实例
    【Mybatis】一对多实例
    【Mybatis】一对一实例
    S5PV210的开发与学习:2.6 UBOOT学习笔记(uboot源码分析3-uboot如何启动内核)
    S5PV210的开发与学习:2.5 UBOOT学习笔记(uboot源码分析2-启动第二阶段)
    S5PV210的开发与学习:2.4 UBOOT学习笔记(uboot源码分析1-启动第一阶段)
    uboot 移植文件差异比较报告
    S5PV210的开发与学习:2.3 UBOOT学习笔记(uboot配置和编译过程详解)
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9138618.html
Copyright © 2020-2023  润新知