zoukankan      html  css  js  c++  java
  • 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

    希望指正,多多留言!

     

     

  • 相关阅读:
    20170705总结
    20170703总结
    .NET 框架程序使用 Win32 API
    青春 就此别过
    Aptana Studio 2启动时提示 Workspace Cannot Be Created 解决办法
    App_GlobalResources.afvubzdv.resources.dll”--“拒绝访问。“
    c# 一维数组和二维数组的定义几种方式<转>.
    C#中Split分隔字符串的应用(C#、split、分隔、字符串)<转>
    C#操作字符串方法总结<转>
    C# 时间格式大全
  • 原文地址:https://www.cnblogs.com/leisure/p/override.html
Copyright © 2011-2022 走看看