鱼C论坛

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

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

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

  2. class A
  3. {
  4. public:
  5.         virtual void foo()
  6.         {
  7.                 std::cout<<"A::foo();"<<std::endl;
  8.         }
  9. };

  10. class B:
  11.         public A
  12. {
  13. public:
  14.         virtual void foo() override
  15.         {
  16.                 std::cout<<"B:foo();"<<std::endl;
  17.         }
  18. };
  19. int main()
  20. {
  21.         B b;
  22.         //reinterpret_cast<A* >(&b)->foo();
  23.         //上面的会执行B::foo();

  24.         //那么问题来了,
  25.         //我通过什么样的手段,能让static_cast<A>(b).foo()
  26.         //和指针调用的效果一样,执行的是B::foo()的代码?
  27.        
  28.         std::cin.get();
  29.         std::cin.get();
  30.         return 0;
  31. }
复制代码
最佳答案
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;
}

小甲鱼最新课程 -> https://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 谢谢你,我要问的就是这个问题!感谢!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

顺便学到了,十分感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 18:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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