鱼C论坛

 找回密码
 立即注册
查看: 1682|回复: 2

[已解决]C++ Class类型强制转换疑问,如何做到与指针类似功能。

[复制链接]
发表于 2017-2-7 01:26:40 | 显示全部楼层 |阅读模式
0鱼币
#include <iostream>

class A
{
public:
        virtual void foo()
        {
                std::cout<<"A::foo();"<<std::endl;
        }
};

class B:
        public A
{
public:
        virtual void foo() override
        {
                std::cout<<"B:foo();"<<std::endl;
        }
};
int main()
{
        B b;
        //reinterpret_cast<A* >(&b)->foo();
        //上面的会执行B::foo();

        //那么问题来了,
        //我通过什么样的手段,能让static_cast<A>(b).foo()
        //和指针调用的效果一样,执行的是B::foo()的代码?
        
        std::cin.get();
        std::cin.get();
        return 0;
}
最佳答案
2017-2-7 01:26:41
本帖最后由 Runs 于 2017-2-7 10:54 编辑

你好 楼主 首先 你要懂得什么是动态绑定和静态绑定 ,指针调用的动态绑定 是通过查询虚表来实现的而 通过 强制转换 是用的静态绑定,编译器直接绑定 A::Foo 地址 所以楼主 {       //我通过什么样的手段,能让static_cast<A>(b).foo()} 应该是无法实现的
不过可以手动调用虚表来实现 B:foo() 函数

#include "stdafx.h"
#include<iostream>
class A
{
public:
        virtual void foo()
        {
                std::cout<<"A::FOO()";
        }
};
class B:public A
{
                virtual void foo()
        {
                std::cout<<"B::FOO()";
        }
};
typedef void (*foo)(int);//声明一个指针
int _tmain(int argc, _TCHAR* argv[])
{
        B b;
        int** pt=(int**)&b;//找到函数地址
        foo ft=(foo)**pt;//赋值函数地址
        ft(123);//调用函数
        std::cin.get();
        std::cin.get();

        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-7 01:26:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Runs 于 2017-2-7 10:54 编辑

你好 楼主 首先 你要懂得什么是动态绑定和静态绑定 ,指针调用的动态绑定 是通过查询虚表来实现的而 通过 强制转换 是用的静态绑定,编译器直接绑定 A::Foo 地址 所以楼主 {       //我通过什么样的手段,能让static_cast<A>(b).foo()} 应该是无法实现的
不过可以手动调用虚表来实现 B:foo() 函数

#include "stdafx.h"
#include<iostream>
class A
{
public:
        virtual void foo()
        {
                std::cout<<"A::FOO()";
        }
};
class B:public A
{
                virtual void foo()
        {
                std::cout<<"B::FOO()";
        }
};
typedef void (*foo)(int);//声明一个指针
int _tmain(int argc, _TCHAR* argv[])
{
        B b;
        int** pt=(int**)&b;//找到函数地址
        foo ft=(foo)**pt;//赋值函数地址
        ft(123);//调用函数
        std::cin.get();
        std::cin.get();

        return 0;
}

1.png
2.png

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
浮砂 + 5 + 5 + 3 谢谢你,我要问的就是这个问题!感谢!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 15:07:05 | 显示全部楼层
ls是马甲!!!!!!!

顺便学到了,十分感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 22:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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