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

    一、虚函数

      C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:

    class A
    {
    public:
    virtual void func() { cout << "A::func() is called" << endl;}
    };
    
    class B: public A
    {
    public:
    virtual void func() { cout << "B::func() is called" << endl;}
    };

     那么,在使用的时候,我们可以:

    A * a = new B();
    a->func(); // 在这里,a虽然是指向A的指针,但是被调用的函数(func)却是B的!

    一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。

    二、多态

      了解了虚函数,那么多态又是什么呢?

       一个动物的基类,基类有speak()这个虚函数,猫和狗都继承了动物这个类,动物speak()这个动作产生的效果就不一样了,如果基类指向的是够,狗的叫声就是“旺旺“,而猫的叫声是”喵喵“。这样同一个动作产生不同的效果的特点,就叫做”多态“。

      多态可以抽象类的”接口“,将实现与声明解耦,在需要派生类的时候写针对派生类的实现。

      多态的实现,依赖虚函数表的机制,编译器在一个类中发现被声明为virtual的函数时,就会将其放入虚函数表中,虚函数表是一个函数数组,在调研虚函数时,根据虚函数表中的函数指针调用具体的实现。

    三、虚函数的使用技巧

       1)基类的析构函数要定位为虚函数。

          在delete一个指向派生类的基类指针时,如果基类析构函数不是虚函数,将不会调用派生类的析构函数,容易造成内存泄露。

       2) 虚构造函数

          构造函数不能为虚函数!!

       3)虚函数呗private修饰

          一样可以产生多态效果,语意为:你最好override我的这个函数,但是你不要管它如何使用,也不要自己调用这个函数。

       4)构造函数与析构函数中的调用的虚函数

          在构造函数与析构函数中调用虚函数,它们将变成一个普通函数,

       5)基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字

       6)虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)

       7)在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。

  • 相关阅读:
    geoserver发布mysql表数据
    geoserver1
    geoserver
    快速搭建arcgis以及cesium环境
    openlayers和cesium实现地图二三维切换
    记Mysql类型引起的BUG
    OpenLayers 图层(Layers) 详解
    基于TrueLicense实现产品License验证功能
    第七章
    第六周进度报告
  • 原文地址:https://www.cnblogs.com/hervey/p/4658216.html
Copyright © 2011-2022 走看看