zoukankan      html  css  js  c++  java
  • c++虚函数

     


    看一些关于虚函数的博客,做了一些总结,列出一些要点备忘。想必,这些也只有我自己了解,毕竟这是我自己想要的。

    1.C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数
    2. 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。
    3. 在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。
    4. 任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法.
    5. 如果父类的虚函数是private或是protected的,但这些非public的虚函数同样会存在于虚函数表中,所以,我们同样可以使用访问虚函数表的方式来访问这些non-public的虚函数。
    6. 如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行滞后联编的。
    7. 只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数。
    8. 静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象。
    9. 内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义,但是在编译的时候系统仍然将它看做是非内联的。
    10.构造函数不能是虚函数,因为构造的时候,对象还是一片未定型的空间,只有构造完成后,对象才是具体类的实例。
    11.析构函数可以是虚函数,而且通常声名为虚函数。

    12。如果析构函数不是虚函数,在析构时,删除的只能是基类的对象,而不能删除了类的对象。这样会有一些数据没清除,造成内存泄漏 。这个举个例子……
    例子如下:

    class ClxBase
    {
    public:
    ClxBase() {};
    virtual ~ClxBase() {};
    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl;
    };
    
    class ClxDerived : public ClxBase
    {
    public:
    ClxDerived() {};
    ~ClxDerived() {
    cout << "Output from the destructor of class ClxDerived!" << endl;
    };
    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
    };
    ClxBase *pTest = new ClxDerived;
    pTest->DoSomething();
    delete pTest;


    输出的结果是:
    Do something in class ClxDerived!
    Output from the destructor of class ClxDerived!

    但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:
    Do something in class ClxDerived!
    也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。

    2012-06-05 23:23:28

  • 相关阅读:
    你是老鸟吗?但是有些你可能目前都不知道的东西
    工具类合集
    也谈Flash mmorpg地图问题【转】
    大量实用工具类、开源包,该帖绝对值得你收藏!
    如何设计产品【页游】
    网络游戏中,玩家常常询问什么时候开新服,其中的本质需求是什么?
    大将军UE分析
    天天连萌UE分析
    selenium IDE 回放报错
    jenkins配置
  • 原文地址:https://www.cnblogs.com/fangshenghui/p/2537449.html
Copyright © 2011-2022 走看看