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