基类中一个函数定义成为虚函数,继承类中把基类中的虚函数重新抄写了一遍,请问这是两个类生成的虚函数表中的函数指针是相同的吗?

解决方案 »

  1.   

    不同,但不知道如何得到,深入浅出MFC中好像有方法介绍
      

  2.   

    对于第一种情况:如果是两个类的虚函数表,肯定不一样,使用过程中主要看THIS指针的指向
    2:应该是不一样的,这个时候可能什么都不做
    3:这个时候没有办法体现它是虚函数的特性,都指向同一个地方。
    我认为是这样,大家讨论,高手指点,呵呵
      

  3.   

    Class A
    {
    Private:
    int x;
    Public:
    virtual print(){cout<<'A'<<endl}
    }
    Class B:Public A
    {
    Private:
    int y;
    Public:
    virtual print(){cout<<'B'<<endl}
    }
    void mian()
    {
    A* a;
    //TODO:让a指向不同,验证结果
    }
      

  4.   

    实验好做,把虚拟函数类加个static变量:
    static int i=0;
    cout<<i<<endl;
    i++;
    如果两次是调用一个地址上的函数的话,第2次输出就是1否则就是0
      

  5.   

    To:coldleafzl() 
    你那样做实际上已经改写了函数,你认为呢?^_^To:wf520pb() 
    你的方法真不错,谢谢~
      

  6.   

    To:wf520pb()
    呵呵,你的方法还是有点问题啊,因为那样的话,两次输出的都是0。
      

  7.   

    我觉得应该定义一个全局static 变量,而不是在类里面定义。^_^我再试试。
      

  8.   

    说过了,定义在函数中是最能体现的。你可以做两方面实验:
    class A
    {
    public:
        void print()
        {
            static int i=0;
            cout<<i<<endl;
            i++;
        }
    };
    A a1,a2;
    void main()
    {
        a1.print();
        a2.print();
    }
    看看结果吧:0   1
    说明是一个地址上的调用,即两个对象的函数地址是相同的(共享这个函数)
    class A
    {
    public:
        void print()   //virtual加与不加都试试
        {
            static int i=0;
            cout<<i<<endl;
            i++;
        }
    };class B
    {
    public:
        void print()
        {
            static int i=0;
            cout<<i<<endl;
            i++;
        }
    };
    A a;
    B b;
    void main()
    {
        a.print();
        b.print();
    }
    结果 0  0
    说明函数地址不同。
      

  9.   

    wf520pb() :你的第二个结果是不能说明问题的。