• c++虚函数


    看了一段时间,觉得应该开始记笔记了,选择博客园是因为在这里学到了好多东西!希望我作为初级的C++(入门级),帮助那些看不懂大牛们写的文章的童鞋们!

    好了,开始吧!

    虚函数----不真实的,关键字: virtual

    class CShape  
    {
    public:
    CShape();
    virtual ~CShape();
    virtual void callangth()=0;
    virtual void calarea()=0;
    virtual void say(); //非纯虚函数

    };


    注意:当你写callangth()=0 ;时,你已经表明这个为纯的虚函数!这个类就是为抽象类!就不要实例化了,不现实!!!

    有人这样说虚函数(很贴切):

    一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。

    2.运行作用和机理:

    虚函数的强大与巧妙在于用于 c++多态里面!

     1 int main(int argc, char* argv[])
    2 {
    3 // CShape *S0=new CShape;
    4 // S0->say();
    5 CShape *S1=new CSanjiao;
    6 S1->calarea();
    7 CShape *S2=new CRetng;
    8 S2->callangth();
    9
    10 CShape *S3=new CCube;
    11 S3->say(); //看来这个爷爷辈的可以
    12
    13 CRetng *S4=new CCube;
    14 S4->say() ;//父辈的也可以
    15 return 0;
    16 }

    灵活的调用了各自不同的方法实现!

    虚函数不同于一般的函数,一般的函数是在编译时就决定了怎样运行,运行那里!然而虚函数不是这样的!下面是一段摘来的介绍:

    编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是 VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生 类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的 时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。通过这些手段,编译器在看到一个虚函数调用的时候,就会将 这个调用改写!

    我的实验结果:

    可见,每一个重写的虚函数都已经分配到了指针,调用时相当于调用了这个指针!

    3.注意点:

    这个虚函数为override 不是overload(重载)!

    基类的析构函数必须是虚函数!

    下面是我的一个例子的下载地址:http://115.com/file/dn86pu6k

    参考文档:http://wenku.baidu.com/view/84520bf67c1cfad6195fa7be.html

    希望指正,多多留言!

     

     

  • 相关阅读:
    06Redis入门指南笔记(安全、通信协议、管理工具)
    05Redis入门指南笔记(持久化)
    04Redis入门指南笔记(内部编码规则简介)
    03Redis入门指南笔记(事务、生存时间、排序、消息通知、管道)
    02Redis入门指南笔记(基本数据类型)
    01Redis入门指南笔记(简介、安装、配置)
    Libev源码分析08:Libev中的内存扩容方法
    Error While Loading Shared Libraries, Cannot Open Shared Object File
    Libev源码分析08:Libev中的信号监视器
    接口开发之PHP创建XML文件
  • 原文地址:https://www.cnblogs.com/leisure/p/override.html
Copyright © 2020-2023  润新知