• C++虚方法(虚函数)随笔


    本文不讨论虚函数的原理,只简单总结下虚函数的常用事项。

    虚函数(虚方法)是C++动态联编 实现多态的重要手段,在函数声明时使用关键字virtual即可,如: virtual void func(void);

    注意:虚函数(虚方法)只针对类的成员函数,普通函数不可声明为虚函数!且一般只有在用到继承时才将基类的成员函数声明为虚函数!

    请看如下代码:

     1 class parentClass
     2 {
     3 public:
     4     parentClass();
     5     ~parentClass();
     6 
     7     void func_1(void);
     8     virtual void func_2(void);
     9 private:
    10 };
    11 
    12 class childClass : public parentClass
    13 {
    14 public:
    15     childClass();
    16     ~childClass();
    17 
    18     void func_1(void);
    19     virtual void func_2(void);
    20 private:
    21 };

    假如有以上声明,则在使用以上类时:

    1 childClass childTest;
    2 parentClass *pParentTest = &childTest;
    3 pParentTest->func_1();
    4 pParentTest->func_2();

    pParentTest指针类型是parentClass基类类型,但它指向的地址对象却是childClass的对象,这种情况下:func_1函数不是虚函数,则调用的是指针类型所在类的函数,即第三句执行的是基类中的func_1函数;func_2函数是虚函数,则调用的是指针指向对象的所在类的函数,即第四句执行的是子类中的func_2函数。

    上面两段代码演示了虚函数最基本的使用,简单总结就是:基类中将某方法定义为虚函数,则在派生类中,该方法仍为虚方法。在使用时,定义基类类型的指针,使其指向派生类的对象,使用该指针调用某个方法,若该方法未被声明为虚函数,则调用的是指针类中的方法,若该方法是虚函数,则调用的是指针指向对象类中的该方法。这也即是动态联编。

    其他情况:

    1) 如上述4行代码,若有pParentTest->func_3();语句,其中func_3函数只在派生类中声明,基类中没有该方法,则会 编译报错 ;

    2) 如上述4行代码,若有pParentTest->func_3();语句,其中func_3函数只在基类中声明,派生类中没有该方法,则会 调用基类的方法 ;

    3) 如果基类声明被重载了,则应在派生类中重新定义所有的基类版本!如果派生类只重新定义了1个版本,则另外的版本将被隐藏,派生类对象无法调用;

    4) 如果派生类要重新定义基类的方法,则派生类中的声明应与基类一致(函数名、参数、返回值),如果派生类的声明与基类参数不一致,则派生类的该方法将覆盖基类中的该方法(不构成重载),派生类对象只能按照派生类方法声明的格式进行调用!(基类中的该方法将被隐藏,派生类对象调用时会报错)

    虚方法的一般使用条件:

    1) 需要在派生类中重新定义基类的方法,则在基类中将该方法声明为虚方法;

    2) 涉及到派生的,一般都将析构函数声明为虚函数;

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

    4) 友元函数不能是虚函数,因为它不是类的成员函数!

  • 相关阅读:
    Netty之WebSocket和四种IO介绍
    java递归展示树形图代码实现以及遇到的问题
    String、String Buffer、String Builder
    物联网的开发应该是什么样子?
    最新 去掉 Chrome 新标签页的8个缩略图
    复化梯形求积分——用Python进行数值计算
    每日设置Bing首页图片为壁纸
    分段二次插值——用Python进行数值计算
    埃尔米特插值问题——用Python进行数值计算
    牛顿插值法——用Python进行数值计算
  • 原文地址:https://www.cnblogs.com/gklovexixi/p/5803270.html
Copyright © 2020-2023  润新知