浮砂 发表于 2017-2-7 01:26:40

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

#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;
}

Runs 发表于 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;
}

四十二 发表于 2017-2-8 15:07:05

ls是马甲!!!!!!!

顺便学到了,十分感谢。
页: [1]
查看完整版本: C++ Class类型强制转换疑问,如何做到与指针类似功能。