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

  • 相关阅读:
    图书管理系统---基于form组件和modelform改造添加和编辑
    Keepalived和Heartbeat
    SCAN IP 解释
    Configure Active DataGuard and DG BROKER
    Oracle 11gR2
    我在管理工作中積累的九種最重要的領導力 (李開復)
    公募基金公司超融合基础架构与同城灾备建设实践
    Oracle 11g RAC for LINUX rhel 6.X silent install(静默安装)
    11gR2 静默安装RAC 集群和数据库软件
    Setting Up Oracle GoldenGate 12
  • 原文地址:https://www.cnblogs.com/hervey/p/4658216.html
Copyright © 2011-2022 走看看