zoukankan      html  css  js  c++  java
  • 虚函数表

     1 class B
     2 {
     3 public:
     4     virtual void fun()
     5     {
     6         printf("fun in B
    ");
     7     }
     8     void b1()
     9     {
    10         printf("b1 in B
    ");
    11     }
    12 };
    13 
    14 class D : public B
    15 {
    16 public:
    17     D()
    18     {
    19         m_d1 =10;
    20     }
    21     void fun()
    22     {
    23         printf("fun in D
    ");
    24     }
    25     void b1()
    26     {
    27         printf("b1 in D
    ");
    28     }
    29     int m_d1;
    30 };
    31 
    32 void main()
    33 { 
    34     B *pb1 = new B;
    35     D *pd1 = (D*)pb1;
    36     pd1->fun();               //问题1,为什么是 fun in B
    37     pd1->b1();                //问题2,为什么是 b1 in D
    38     printf("%d
    ",pd1->m_d1); //问题3,为什么是 乱码 ;
    39     int a;
    40     ((B*)(&a))->b1();         //问题4 ,怎么会成功?B* 强转指定要调用B类的b1()吗?强转内存地址有什么变化吗?
    41 }
    View Code

    先参考:http://blog.csdn.net/haoel/article/details/1948051/

               http://www.linuxidc.com/Linux/2013-07/87901.htm

    然后说说我的认识:

    问题一:

    因为new出的对象是B,所以该对象虚函数表中fun未被D中的fun覆盖,于是" fun in B"

    问题二:

    因为pd1指针是指向D的,所以调用b1,是去D的公共函数区调用,于是“ fun in D"

    问题三:

    m_d1是数据,pd1按照D的方式去取B对象的数据,而B没有这个数据,于是访问未知地址,得到乱码

    问题四:

    同二,类的函数是放在公共函数区的,所以哪怕不是类对象,也可以成功调用

    画了个图,辅助上面的思考:

  • 相关阅读:
    Can you feel my word?
    木语录
    走在风雨中
    我看平淡生活……
    Can you feel my word?
    我看平淡生活……
    留言本
    Python(七)之匿名函数lambda
    python之常用模块logging
    python(六)之面向对象
  • 原文地址:https://www.cnblogs.com/TaoyzDream/p/3699736.html
Copyright © 2011-2022 走看看