zoukankan      html  css  js  c++  java
  • 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) 友元函数不能是虚函数,因为它不是类的成员函数!

  • 相关阅读:
    设计模式之命令模式
    设计模式之访问者模式
    ES6入门之Generator函数
    ES6入门之Iterator和for...of
    c# TcpClient简易聊天工具
    Mvc Action可以通过jsonp方式调取
    Webbrowser 在web项目中的使用
    关于java post get请求Demo (请求c#iis接口)
    Jquery 引擎模板 -template详解
    Redis在windows下安装过程
  • 原文地址:https://www.cnblogs.com/gklovexixi/p/5803270.html
Copyright © 2011-2022 走看看