zoukankan      html  css  js  c++  java
  • 虚函数

    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的话,只能释放父类对象的内存空间,不能释放子类对象的内存空间。
    }
    
  • 相关阅读:
    Invalid command 'RewriteEngine'解决办法
    JEZ reCAPTCHA 谷歌验证码插件及使用方法
    一段图片预加载的代码
    Fancybox
    Silverlight4 beta 中的.net ria service自定义用户身份验证之改变
    .net ria service 数据验证(7)
    .net ria services 自定义函数(9)
    C#开发ActiveX控件及制作CAB包
    Silverlight 3.0 中的 Local Connection
    Silverlight3端操作数据库(5)
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9138618.html
Copyright © 2011-2022 走看看