zoukankan      html  css  js  c++  java
  • 虚函数和非虚函数的区别(转)

    1.当由指针调用由子类(或某一个类)实例化的对象时(不管此指针是指向谁的那个类型的,只要合法),当指针调用此对象中的函数时(不管是子类中添加的还是由父类继承来的),如果此函数是非虚拟函数,则首先在那个类中寻找这个函数,若找不到则依次向父类中寻找,直至找到(如果找不到,那此程序就出错了,呵呵),但不会向下向子类中寻找;如果此函数是虚拟函数,则就要严重关注此实例化对象,不管是先前指针所指向的还是后来又实例化的,具体情况具体分析(废话)(依次严重关注调用函数所属于的实例化的对象),要在某类中调用某函数时要追本溯源,重新返回产生对象的那个类(可能是最后的子类),再依次向父类寻找(不要懒,呵呵),看看到底是属于哪个类的,而不要被函数所在的位置所迷惑,实际有可能要调用的函数在子类,本类或父类中。(注:如果调用函数的前面指明调用属于哪个类那个域的函数,没办法,只有调用那个类的了。如:CWinThread::Run(),只有调用CWinThread类中的Run()函数了)

    附两个小程序以供参考调试:

    a)非虚拟函数:

    #include<iostream.h>

    class CBase

    {

    public:

           void Init()//virtual

           {

                  cout << "CBase::Init()" << endl;

           }

           void fun()//virtual

           {

                  cout << "CBase::fun()" << endl;

           }

    };

    class CChild1 : public CBase

    {

    public:

           void Init()//virtual

           {

                  cout << "CChild1::Init()" << endl;

           }

           void fun()

           {

                  cout << "CChild1::fun()" << endl;

           }

    };

    class CChild2 : public CChild1

    {

    public:

           void Init()//virtual

           {

                  cout << "CChild2::Init()" << endl;

                  fun();

           }

           void fun()

           {

                  cout << "CChild2::fun()" << endl;

           }

    };

    class CChild3 : public CChild2

    {

    public:

           CChild3()

           {

                  Init();

           }

           void fun()

           {

                  cout << "CChild3::fun()" << endl;

           }

    };

    void main()

    {

           CChild3* m_pCurrent = NULL;

           m_pCurrent = new CChild3;

    }

    输出:

    CChild2::Init()

    CChild2::fun()

    b)虚拟函数:

    #include<iostream.h>

    class CBase

    {

    public:

           void Init()//virtual

           {

                  cout << "CBase::Init()" << endl;

           }

           virtual void fun()//

           {

                  cout << "CBase::fun()" << endl;

           }

    };

    …………………

    ……………………//下面完全跟非虚拟函数的相同,二者区别只是在虚拟函数中的类CBasefun()函数前加了一个virtual关键字而已。

    输出:

    CChild2::Init()

    CChild3::fun()

  • 相关阅读:
    ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)
    ACM/ICPC 之 三维计算几何+暴力枚举+判重(HDU5839)
    ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
    ACM/ICPC 之 Dinic+枚举最小割点集(可做模板)(POJ1815)
    ACM/ICPC 之 DP解有规律的最短路问题(POJ3377)
    ACM/ICPC 之 DFS+SPFA-贪心+最短路(POJ2679)
    ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)
    maven的setting.xml配置文件详解(中文)
    高性能、高可用的分布式架构体系(有启发的)
    各种数据库再spring中的配置(转载)
  • 原文地址:https://www.cnblogs.com/jincwfly/p/731230.html
Copyright © 2011-2022 走看看