wenmingxing 发表于 2016-8-18 18:09:50

C++中虚函数本身还可以通过指针调用吗,如何调用

如题,我们都知道虚函数是根据指针指向调用的,但是基类中虚函数本身还可以通过指针调用吗?
一个小例子:
#include<iostream>

using namespace std;

class A
{
public :
    virtual void play();
};

class B : public A
{
public :
    void play();
};

void A :: play()
{
    cout << "AAA" << endl;
}

void B :: play()
{
    cout << "BBB" << endl;
}

main()
{
    A a;
    B b;

    a.play();

    A *aa;
    aa=&b;

    aa -> play();
}


可以通过a.play调用,但是我想知道可以通过指针形式调用A::play 吗???

浅云纸月 发表于 2016-8-18 19:38:18

void A :: play()
{
    cout << "AAA" << endl;
}

void B :: play()
{
    A::play();
    cout << "BBB" << endl;
}


可以这样子实现.

wenmingxing 发表于 2016-8-18 19:41:48

浅云纸月 发表于 2016-8-18 19:38
可以这样子实现.

B :: play 中的A::play 是什么含义呢?

wskmm 发表于 2016-8-18 19:48:27

B :: play 中的A::play 是什么含义呢?

浅云纸月 发表于 2016-8-18 20:47:16

wenmingxing 发表于 2016-8-18 19:41
B :: play 中的A::play 是什么含义呢?

在 B::play() 里面 调用 A::play() 是指调用基类的函数. B是继承A的, 所以 B是可以调用基类A的函数的, 通过 A::play() 就能调用了

浅云纸月 发表于 2016-8-18 21:00:43

本帖最后由 浅云纸月 于 2016-8-19 22:45 编辑

直接在外部调用基类A的函数也可以实现 ...不过确实可以实现, 会麻烦一点.我写了下代码, 你看一下, 不懂的尽管问



#include "stdafx.h"
#include <iostream>

#include <windows.h>


using namespace std;

class A
{
public:
      virtual void play();
};

class B : public A
{
public:
      void play();
};

void A::play()
{
      
      cout << "AAA" << endl;
}

void B::play()
{
      cout << "BBB" << endl;
}

int main()
{
      // 获取类 A 的 vftable
      struct tagCLASS
      {
                DWORD *pVMT;
      };
      A a;
      DWORD *pVMT = ((tagCLASS *)(&a))->pVMT;

      // 获取 vftable 中的 play() 函数的内存地址
      static void(__fastcall *pfnA_Play)(void *pthis) = NULL;
      pfnA_Play = (void(__fastcall *)(void *pthis))pVMT;

      B b;
      A* aa = &b;

      // 调用 类A 的play()函数
      pfnA_Play(aa);

    return 0;
}

iszhuangsha 发表于 2016-8-29 01:19:57

aa=&a
aa.play()
或者通过限定符调用类A的函数,即A::play()
页: [1]
查看完整版本: C++中虚函数本身还可以通过指针调用吗,如何调用