• C++支持的多态方式


     1、通过一个隐式转换,从派生类指针或引用转换到其公有基类的指针或引用。

             Query *pquery = new NameQuery("Glass");

     2、通过虚拟函数机制:

          pquery-eval();

    3、通过dynamic_cast和typeid操作符

      if( NameQuery *pnq = dynamic_cast <NameQuery *>(pquery)) ....

    在MFC中,通过某个基类的调用,通过定义基类对象,或者直接调用函数(通过this指针)来

    实现多态的性质。如OnMsgCmd函数,当调用进入的this指针的更改后,OnMsgCmd的

    调用主也发生相应的改变。

    上面是在学习深入浅出MFC时学习的。后来又看了C++ Primer,设计模式等书籍,对于虚拟多态的理解更多了一些:

       C++中通过虚拟函数列表实现虚拟函数,是OOP最为重要的方向,vptr指针数组是编译器自己加上去的,派生类继承基类的时候,vptr指针也是被继承存在与派生类中,当派生类中将虚拟函数重新定义后,vptr指针数组中相关函数地址值也修改为重新定义后的指针,这与override功能类似。

     通过基类指针,调用虚拟函数时,在编译器内部可以转换为调用通过vptr指针调用函数,而vptr指针数组是基类与派生类同时存在的,因此派生类的虚拟函数就可以被正确调用了。

      关于这方面的文章,csdn中已经有不少了:

        http://blog.csdn.net/x_j_best/archive/2007/12/19/1954308.aspx (有详尽的虚拟函数表说明)

        http://blog.csdn.net/darongtou/archive/2007/12/15/1937882.aspx (不将析构函数声明为虚拟函数的问题介绍)

       http://blog.csdn.net/hong_sea/archive/2007/12/06/1920022.aspx  (这里面也有一些介绍)

      通过公有继承的派生类函数,可以将基类的private属性的函数,转变为public属性的函数,改变访问属性。

     当一个类的析构函数被声明为虚拟函数或者成员函数中有纯虚拟函数时,表明该类为基类,需要在派生类中重新定义,一般情况下,析构函数被声明为纯虚拟函数更为妥当,其它函数可以有一个空定义,这样可以减少派生类的工作量,而又不失基类为abstract类。

     

    /*
    *
    * Copyright (c) 2011 Ubunoon.
    * All rights reserved.
    *
    * email: netubu#gmail.com replace '#' to '@'
    * http://www.cnblogs.com/ubunoon
    * 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
    * 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
  • 相关阅读:
    frida rpc调用维护ios手机脚本
    latex表格调整行距
    latex插图自动在双栏的最top,IEEE期刊格式
    latex插图egin{minipage}强制左移hspace命令
    SYNTHIA-RAND-CITYSCAPES数据集云盘下载
    一种用于多张图片同时缩放比较细节的软件faststone
    shopxo安装插件被限制绑定账号的问题
    ShopXo框架去掉绑定商店的提示
    拓扑排序
    前缀和和差分
  • 原文地址:https://www.cnblogs.com/ubunoon/p/2058932.html
Copyright © 2020-2023  润新知