按说只有静态成员函数才能在类实例化之前就可以直接使用,但是VC中到处可以看到诸如类名::函数名()的用法,比如CWnd::SetDlgItemText
我的困惑就是,我查找了SetDlgItemText的定义和声明,它并不是静态成员函数啊,为何能直接调用呢,还是说C++的类的函数无论是否静态,只要不涉及到其它成员变量和函数,就可以用域操作符在任何地方调用?

解决方案 »

  1.   

    因为 调用的地方时它子类的成员函数class A{
      virtual void test();
    };
    class B{
      void test();
      void test1() {
       A::test();//ok
      }
    };
    void main()
    {
      A::test()//error
    }
      

  2.   

    相当于 c# 的 base
      

  3.   

    因为调用的地方,并不是直接调用的类中的非晶态成员函数,而是实例化对象之后调用的。你看一下MFC的类继承结构就可以看到,其实调用时候的作用区域,所处的对象,也是一种CWnd对象。它调用的是自己的成员函数,只不过你没发现它是CWnd对象而已。
      

  4.   


    双冒号在这个地方叫做域操作符,表示这个函数是前面对象的一个方法。“事实的调用主动方仍然是一个实例化后的对象?”这么说不准确,调用的主动方是CWnd::SetDlgItemText这个代码所处的方法。实例化的对象是这些非静态函数能够执行的前提。