鱼C论坛

 找回密码
 立即注册
查看: 2623|回复: 6

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

[复制链接]
发表于 2016-8-18 18:09:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,我们都知道虚函数是根据指针指向调用的,但是基类中虚函数本身还可以通过指针调用吗?
一个小例子:
#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 吗???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-18 19:38:18 | 显示全部楼层
void A :: play()
{
    cout << "AAA" << endl;
}

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


可以这样子实现.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-18 19:41:48 | 显示全部楼层

B :: play 中的  A::play 是什么含义呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-18 19:48:27 | 显示全部楼层
B :: play 中的  A::play 是什么含义呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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() 就能调用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0];

        B b;
        A* aa = &b;

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

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-29 01:19:57 | 显示全部楼层
aa=&a
aa.play()
或者通过限定符调用类A的函数,即A::play()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 08:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表