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 吗??? void A :: play()
{
cout << "AAA" << endl;
}
void B :: play()
{
A::play();
cout << "BBB" << endl;
}
可以这样子实现. 浅云纸月 发表于 2016-8-18 19:38
可以这样子实现.
B :: play 中的A::play 是什么含义呢? B :: play 中的A::play 是什么含义呢? wenmingxing 发表于 2016-8-18 19:41
B :: play 中的A::play 是什么含义呢?
在 B::play() 里面 调用 A::play() 是指调用基类的函数. B是继承A的, 所以 B是可以调用基类A的函数的, 通过 A::play() 就能调用了 本帖最后由 浅云纸月 于 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;
}
aa=&a
aa.play()
或者通过限定符调用类A的函数,即A::play()
页:
[1]