杨寅飞 2009年10月14日 星期三 10:17 | 1849次浏览 | 8条评论
其实这个应
起因是昨天在TL上看到的一个帖子,关于C++ virtual function中vptr一个trick的利用,具体是这样的
#include <iostream>
using namespace std;
class A {
public:
virtual void func() { cout << "hello A"<<endl;}
};
class B {
public:
virtual void bar() { cout << "hello B"<<endl;}
};
main()
{
A *p = new A;
B *b = (B*)p;
b->bar();
};
output: hello A
这个例子的原理是这样的, 关于C++ class中virtual function的查找方式, 我们知道包含有virtual function的class会为自己建一张vtable表,表里面记录自己所拥有的virtual function,并通过vptr[?]来访问, 以此来支持多态, 因此这里所利用的trick就是通过访问原类A的vptr来达到访问func()的目的,详细解释下就是这里虽然调用的是b->bar(),但是实际上是通过b->vptr[0]来访问, 而vptr[0]的值其实这里指向的是class A的func(), 于是就有了以上输出。
PS:其实这个应当是未定义行为,依赖于编译器内存布局及实现。
Zeuux © 2024
京ICP备05028076号
回复 马壮 2009年10月19日 星期一 21:16