随笔-0  评论-0  文章-24  trackbacks-0
      /*虚函数表*/
      

      
 1#include <iostream>
 2using namespace std;
 3class Base
 4{
 5    private:
 6    virtual void f()
 7    {
 8        cout << "Base::f" << endl;
 9
10    }

11    virtual void g()
12    {
13        cout << "Base::g" << endl;
14    }

15    virtual void h()
16    {
17        cout << "Base::h" << endl;
18    }

19}
;
20int main(void)
21{
22    typedef void (*Fun)(void);
23    Base b;
24    Fun pFun = NULL;
25    cout << "虚函数表地址:" << (int*)(&b) << endl;
26    cout << "虚函数表-第一个函数地址:" << (int*)*(int*)(&b) << endl;
27    pFun = (Fun)*(((int*)*(int*)(&b)) + 0);
28    pFun();
29    pFun = (Fun)*(((int*)*(int*)(&b)) + 1);
30    pFun();
31    pFun = (Fun)*(((int*)*(int*)(&b)) + 2);
32    pFun();
33    return 0;
34}

35


      /*一般继承(无虚函数覆盖)*/
      



 

 1#include <iostream>
 2using namespace std;
 3class Base
 4{
 5    private:
 6    virtual void f()
 7    {
 8        cout << "Base::f" << endl;
 9
10    }

11    virtual void g()
12    {
13        cout << "Base::g" << endl;
14    }

15    virtual void h()
16    {
17        cout << "Base::h" << endl;
18    }

19}
;
20class Derive:public Base
21{
22    private:
23    virtual void f1()
24    {
25        cout << "Derive::f1" << endl;
26
27    }

28    virtual void g1()
29    {
30        cout << "Derive::g1" << endl;
31    }

32    virtual void h1()
33    {
34        cout << "Derive::h1" << endl;
35    }

36}
;
37int main(void)
38{
39    typedef void (*Fun)(void);
40    Derive d;
41    Fun pFun = NULL;
42    cout << "虚函数表地址:" << (int*)(&d) << endl;
43    cout << "虚函数表-第一个函数地址:" << (int*)*(int*)(&d) << endl;
44    pFun = (Fun)*(((int*)*(int*)(&d)) + 0);
45    pFun();
46    pFun = (Fun)*(((int*)*(int*)(&d)) + 1);
47    pFun();
48    pFun = (Fun)*(((int*)*(int*)(&d)) + 2);
49    pFun();
50    pFun = (Fun)*(((int*)*(int*)(&d)) + 3);
51    pFun();
52    pFun = (Fun)*(((int*)*(int*)(&d)) + 4);
53    pFun();
54    pFun = (Fun)*(((int*)*(int*)(&d)) + 5);
55    pFun();
56    return 0;
57}

 


       /*一般继承(有虚函数覆盖)*/




 1#include <iostream>
 2using namespace std;
 3class Base
 4{
 5    private:
 6    virtual void f()
 7    {
 8        cout << "Base::f" << endl;
 9
10    }

11    virtual void g()
12    {
13        cout << "Base::g" << endl;
14    }

15    virtual void h()
16    {
17        cout << "Base::h" << endl;
18    }

19}
;
20class Derive:public Base
21{
22    private:
23    virtual void f()
24    {
25        cout << "Derive::f" << endl;
26
27    }

28    virtual void g1()
29    {
30        cout << "Derive::g1" << endl;
31    }

32    virtual void h1()
33    {
34        cout << "Derive::h1" << endl;
35    }

36}
;
37int main(void)
38{
39    typedef void (*Fun)(void);
40    Base *= new Derive();
41    Fun pFun = NULL;
42    cout << "虚函数表地址:" << (int*)(b) << endl;
43    cout << "虚函数表-第一个函数地址:" << (int*)*(int*)(b) << endl;
44    pFun = (Fun)*(((int*)*(int*)(b)) + 0);
45    pFun();
46    pFun = (Fun)*(((int*)*(int*)(b)) + 1);
47    pFun();
48    pFun = (Fun)*(((int*)*(int*)(b)) + 2);
49    pFun();
50    pFun = (Fun)*(((int*)*(int*)(b)) + 3);
51    pFun();
52    pFun = (Fun)*(((int*)*(int*)(b)) + 4);
53    pFun();
54    return 0;
55}

56


      /*多重继承(无虚函数覆盖)*/



 1#include <iostream>
 2using namespace std;
 3class Base1
 4{
 5    private:
 6    virtual void f()
 7    {
 8        cout << "Base1::f" << endl;
 9    }

10    virtual void g()
11    {
12        cout << "Base1::g" << endl;
13    }

14    virtual void h()
15    {
16        cout << "Base1::h" << endl;
17    }

18}
;
19class Base2
20{
21    private:
22    virtual void f()
23    {
24        cout << "Base2::f" << endl;
25    }

26    virtual void g()
27    {
28        cout << "Base2::g" << endl;
29    }

30    virtual void h()
31    {
32        cout << "Base2::h" << endl;
33    }

34}
;
35class Base3
36{
37    private:
38    virtual void f()
39    {
40        cout << "Base3::f" << endl;
41    }

42    virtual void g()
43    {
44        cout << "Base3::g" << endl;
45    }

46    virtual void h()
47    {
48        cout << "Base3::h" << endl;
49    }

50}
;
51class Derive:public Base1, public Base2, public Base3
52{
53    virtual void f1()
54    {
55        cout << "Derive::f1" << endl;
56    }

57    virtual void g1()
58    {
59        cout << "Derive::g1" << endl;
60    }

61}
;
62int main(void)
63{
64    typedef void (*Fun)(void);
65    Derive d;
66    Fun pFun = NULL;
67    cout << "虚函数表地址:" << (int*)(&d) << endl;
68    cout << "第一个虚函数表地址:" << (int*)*((int*)(&d) + 0<< endl;
69    cout << "第二个虚函数表地址:" << (int*)*((int*)(&d) + 1)<< endl;
70    cout << "第三个虚函数表地址:" << (int*)*((int*)(&d) + 2)<< endl;
71    pFun = (Fun)*(((int*)*((int*)(&d) + 0)) + 0);
72    pFun();
73    pFun = (Fun)*(((int*)*((int*)(&d) + 0)) + 1);
74    pFun();
75    pFun = (Fun)*(((int*)*((int*)(&d) + 0)) + 2);
76    pFun();
77    pFun = (Fun)*(((int*)*((int*)(&d) + 0)) + 3);
78    pFun();
79    pFun = (Fun)*(((int*)*((int*)(&d) + 0)) + 4);
80    pFun();
81
82    pFun = (Fun)*(((int*)*((int*)(&d) + 1)) + 0);
83    pFun();
84    pFun = (Fun)*(((int*)*((int*)(&d) + 1)) + 1);
85    pFun();
86    pFun = (Fun)*(((int*)*((int*)(&d) + 1)) + 2);
87    pFun();
88
89    pFun = (Fun)*(((int*)*((int*)(&d) + 2)) + 0);
90    pFun();
91    pFun = (Fun)*(((int*)*((int*)(&d) + 2)) + 1);
92    pFun();
93    pFun = (Fun)*(((int*)*((int*)(&d) + 2)) + 2);
94    pFun();
95    return 0;
96}

97


      
      
      /*多重继承(有虚函数覆盖)*/

      



 1#include <iostream>
 2using namespace std;
 3class Base1
 4{
 5    private:
 6    virtual void f()
 7    {
 8        cout << "Base1::f" << endl;
 9    }

10    virtual void g()
11    {
12        cout << "Base1::g" << endl;
13    }

14    virtual void h()
15    {
16        cout << "Base1::h" << endl;
17    }

18}
;
19class Base2
20{
21    private:
22    virtual void f()
23    {
24        cout << "Base2::f" << endl;
25    }

26    virtual void g()
27    {
28        cout << "Base2::g" << endl;
29    }

30    virtual void h()
31    {
32        cout << "Base2::h" << endl;
33    }

34}
;
35class Base3
36{
37    private:
38    virtual void f()
39    {
40        cout << "Base3::f" << endl;
41    }

42    virtual void g()
43    {
44        cout << "Base3::g" << endl;
45    }

46    virtual void h()
47    {
48        cout << "Base3::h" << endl;
49    }

50}
;
51class Derive:public Base1, public Base2, public Base3
52{
53    virtual void f()
54    {
55        cout << "Derive::f" << endl;
56    }

57    virtual void g1()
58    {
59        cout << "Derive::g1" << endl;
60    }

61}
;
62int main(void)
63{
64    typedef void (*Fun)(void);
65    Derive d;
66    Fun pFun = NULL;
67    cout << "虚函数表地址:" << (int*)(&d) << endl;
68    cout << "第一个虚函数表地址:" << (int*)*((int*)(&d) + 0<< endl;
69    cout << "第二个虚函数表地址:" << (int*)*((int*)(&d) + 1)<< endl;
70    cout << "第三个虚函数表地址:" << (int*)*((int*)(&d) + 2)<< endl;
71    pFun = (Fun)*(((int*)*((int*)(&d) + 0)) + 0);
72    pFun();
73    pFun = (Fun)*(((int*)*((int*)(&d) + 0)) + 1);
74    pFun();
75    pFun = (Fun)*(((int*)*((int*)(&d) + 0)) + 2);
76    pFun();
77    pFun = (Fun)*(((int*)*((int*)(&d) + 0)) + 3);
78    pFun();
79
80    pFun = (Fun)*(((int*)*((int*)(&d) + 1)) + 0);
81    pFun();
82    pFun = (Fun)*(((int*)*((int*)(&d) + 1)) + 1);
83    pFun();
84    pFun = (Fun)*(((int*)*((int*)(&d) + 1)) + 2);
85    pFun();
86
87    pFun = (Fun)*(((int*)*((int*)(&d) + 2)) + 0);
88    pFun();
89    pFun = (Fun)*(((int*)*((int*)(&d) + 2)) + 1);
90    pFun();
91    pFun = (Fun)*(((int*)*((int*)(&d) + 2)) + 2);
92    pFun();
93    return 0;
94}

95



 































      




posted on 2012-10-25 14:05 zhuxin 阅读(159) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理