杨寅飞

杨寅飞的博客

他的个人主页  他的博客

C++的奇技淫巧(一)

杨寅飞  2009年10月14日 星期三 10:17 | 1781次浏览 | 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哲思注册吗?现在 注册 !
马壮

回复 马壮  2009年10月19日 星期一 21:16

娱乐娱乐……

0条回复

李洋

回复 李洋  2009年10月19日 星期一 00:43

看来同时在哲思和TL的人真是很多啊

0条回复

曹帅军

回复 曹帅军  2009年10月15日 星期四 22:11

有时候,越危险的地方往往越安全,不过首先要搞清编译器的行为。

0条回复

孟德

回复 孟德  2009年10月15日 星期四 09:26

。。这个不是奇技,纯属淫巧。两个函数签名不同,这程序都危险。

0条回复

罗万华

回复 罗万华  2009年10月15日 星期四 00:15

嗯,有点意思。 不过,少用为妙。

0条回复

刘磊(V.L.)

回复 刘磊(V.L.)  2009年10月14日 星期三 15:45

就和菜刀一样,杀人就算凶器。

0条回复

邓楠

回复 邓楠  2009年10月14日 星期三 11:20

hoho~ 这么写代码很危险啊。

1条回复

  • 杨寅飞

    回复 杨寅飞  2009年10月14日 星期三 13:56

    恩~ 这样写是很危险, 放到这里纯粹是自娱自乐, 呵呵:)

    0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号