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)也不一样。

  • 相关阅读:
    gateway调用Fegin失败问题解决
    JVM调试命令简介
    oracle10g登录em后,提示“java.lang.Exception: Exception in sending Request :: null”
    vs2019中让ashx 文件中折叠收起代码
    oracle多表视图不自动更新,手动刷新视图获得基本表的数据
    可以对表单中的隐藏字段进行操纵 问题参数 __VIEWSTATEGENERATOR
    SQL Server 检测到基于一致性的逻辑 I/O 错误 页撕裂
    WIN2016和WIN10关闭同步主机服务,节省磁盘频繁读取,并关闭自动维护
    IIS网站应用程序配置不继承网站.net框架版本
    c#web错误码CS0227,不安全代码只会在使用/unsafe编译情况下出现
  • 原文地址:https://www.cnblogs.com/hervey/p/4658216.html
Copyright © 2011-2022 走看看