虚函数原理

来源:互联网 发布:口袋助理源码 编辑:程序博客网 时间:2024/06/07 06:44

http://www.cnblogs.com/rocketfan/archive/2009/09/18/1569294.html

 

 虚函数表算是面试官最爱问的C++问题了,如果你的简历提到熟悉C++而关于虚函数机制没有回答好,那么你就会被怀疑。。。:)

我觉得虽然理解虚函数表不是编程必须的,但是了解一下还是有帮助的,侯捷翻译的<<Inside C++ model>>应该是最详细解释所有这些的了。不过网上有很多很好的资源,
下面转载陈皓的文章http://blog.csdn.net/haoel/archive/2007/12/18/1948051.aspx
主要为了查阅方便,另外转载http://www.pconline.com.cn/pcedu/empolder/gj/c/0503/566020.html管宁写的关于函数指针写的很清楚。
另外关于C++虚函数解析需要补充的是作者为了实现清晰,没有提到c++的this指针, 对于 Base.f()其实它的原型是类似f(Base* this)的函数,由于作者用了
强制类型转换所以用了typedef void(*Fun)(void); 如果f()函数中会访问到Base的数据成员,那么结果显然是不对的。可以用typedef void(*Fun2)(int *);
或者typedef void(*Fun3)(Base *); 
class Base {
    public:
        Base():x(3), y(4){}

        virtual void f() { cout << "Base::f" << endl; cout << "my x is " << x << endl;}

        virtual void g() { cout << "Base::g" << endl; }

        virtual void h() { cout << "Base::h" << endl; }

        int x;
        int y;
};

   Base b;
    Fun2 pfun2;
    pfun2 = (Fun2)*((int *)*(int *)(&b));
    pfun2((int *)&b);
    
    Fun3 pfun3;
    pfun3 = (Fun3)*((int *)*(int *)(&b));
    pfun3(&b);
这样产生的结果才会和Base base; base.f()完全相同,显示3,而利用typedef void(*Fun)(void),结果是 -1209178304
(当然因为作者给的例子中f()函数中没有访问对象数据成员,结果也就不会出错,作者仅仅是为了演示虚函数表的实现。)
另外实验了下,虚函数表的指针会占用对象的第一个位置,之后是对象数据,上面的例子中x,然后是y。
虚函数表每个类拥有一个,相同的类不同实例对象的虚函数表指针都指向相同的一个虚函数表。
0 0
原创粉丝点击