QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1657|回复: 0
打印 上一主题 下一主题

C++ 中多继承情况下 如何确定某个类型的方法,在虚函数表中的位置?

[复制链接]
字体大小: 正常 放大
蕾欧娜        

19

主题

9

听众

25

积分

升级  21.05%

  • TA的每日心情
    郁闷
    2015-4-14 11:21
  • 签到天数: 1 天

    [LV.1]初来乍到

    自我介绍
    德玛西亚
    跳转到指定楼层
    1#
    发表于 2015-4-17 09:51 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    [backcolor=white !important][size=1em]
    [size=1em][size=1em]  class: Y! t7 [3 T1 y! `+ Z
    [size=1em]      InterfaceU1; J$ G0 Q! r% U3 R
    [size=1em]  {
    * T8 a# [! T- `[size=1em]  public:
    : ?( j+ ?. L+ n$ H( U# b[size=1em]      virtual void func1() = 0;* T7 o  q7 Z  U$ \
    [size=1em]  }: s' z$ L/ Z: E7 l; V0 l
    ; d0 x% Y7 u5 L; M
    [size=1em]  class/ F9 M  x1 j. m" e( Q0 e; K
    [size=1em]      InterfaceU2
    6 W( _7 m" L$ z- X, x. ?- V[size=1em]  {  y; P0 ^, E: f% K4 _9 g; }0 ]
    [size=1em]  public:
    # @9 [, }' j! o# g6 R. Y[size=1em]      virtual void func2() = 0;
    8 w; M' w2 G+ w/ W0 Z+ U) M% S[size=1em]  }
      b; ?$ s2 Q+ _- P( N- k0 V& r, G: V, [
    [size=1em]  class/ V6 Q7 Z0 ?9 c9 i1 O3 P
    [size=1em]    Wrapper. E6 s7 I* W( b
    [size=1em]  {- c- o0 g0 K* [* b
    [size=1em]  public:
    4 J- }( ^8 _& |6 j) f4 o" i[size=1em]      virtual InterfaceU1* getInterface1() = 0;
    . L6 B0 U; U3 t[size=1em]      virtual InterfaceU2* getInterface2() = 0;
    $ ^4 P2 d0 ^  v( w" c[size=1em]  }
    - C" U. [& ?6 j: |) a+ N4 t! }; h6 {* U# h+ J
    [size=1em]  class
    * z) E- Y1 y: R; d6 ^% W! _# y[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2  n, |5 Y! V) a; X: E
    [size=1em]  {
      n0 P/ q6 [) ?[size=1em]  public:' F9 J8 N0 `4 D9 Q: V* X* e
    [size=1em]      virtual InterfaceU1* getInterface1()! I' U) ~4 _! r7 l/ P( n5 S6 r
    [size=1em]      {
    ) v( Y5 U7 G) N/ a* E[size=1em]          return this;. c# B" {3 J9 D
    [size=1em]      }
    4 s/ w3 c/ i4 M[size=1em]      virtual InterfaceU2* getInterface2()
    ) G- e0 ~$ z5 L( @! W[size=1em]      {
    3 ]* ]' |& ~0 k& _7 t
    % N7 q$ v0 G. m6 u/ [[size=1em]          return this;
    : n1 F  }, j6 b9 o- o: l+ j[size=1em]     }) s. g% A" r  l2 m2 [
    [size=1em]     virtual void func1()6 ]5 H1 `! s& `" s
    [size=1em]     {8 [3 B" ?& B3 d- ?. r" N
    [size=1em]         printf("%s", "func1");0 f1 }  e% L5 |0 m( ]0 E
    [size=1em]     }
    : W4 I6 P6 `, c2 @
    ; B/ G6 K/ |; v6 K7 _! q6 o[size=1em]     virtual void func2()
    6 O6 J. U' ^# [# K& l[size=1em]     {
    * B* Q3 Q- T. ?7 \3 l7 T" o+ J: a8 \) \[size=1em]        printf("%s", "func2");+ A$ h7 f9 a# F5 S  M) |) }6 ]* s( N
    [size=1em]     }
    ; Y; z8 m5 F2 P# J2 _! l[size=1em] }
    , V5 z9 G4 r2 C" z( f7 Q5 W3 B% W' Q5 Z( C( ~. V

    9 }* N" H2 \  T, Z; r  E
    # A6 S1 {6 e$ t/ U
    ' p: P6 b. o8 r& Q% C, m
    假设有如下代码:
    ( _& n  Y( t) T9 Y[backcolor=white !important][size=1em]PHP code
      @/ |  [8 r' N: K1 [
    [color=white !important][size=1em]?

    5 h3 U  g* \* X7 ^8 h/ q
    [size=1em]1

    ' z& {4 w9 W$ `  u: W; ?
    [size=1em]2
    3 R9 Z2 B9 p4 w; Y+ x
    [size=1em][size=1em]Base* pBase = new Base();
    ( e$ L/ A, B# H3 H[size=1em]pBase->getInterface1()->func1();
    3 `! H0 l0 V; Y, z; x$ V# q* A/ P
    / m' X8 V9 t# k) p0 g
    8 s, B$ H, |' a! E  H9 G
    3 _! \3 I+ V  ^: n: l1 F

    : q( a% B/ o" z' Z& N; N其实以上代码等于:
    , {7 \( z' ^; \+ i  \[backcolor=white !important][size=1em]PHP code
    6 b9 ?$ l. L; p1 [6 O* P3 m
    [color=white !important][size=1em]?

    / K  p2 h# ?+ l7 A1 d
    [size=1em]1

    7 D& P2 ?* x- g! I) b
    [size=1em]2
    0 o3 G" H3 r. u3 ?7 q* n; U" P! ]
    [size=1em]3

    # u% N  y+ x6 G# p
    [size=1em][size=1em] Base* pBase = new Base();
    3 u9 w( ~" a, x) Z[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();) d! ~2 e4 F2 e; Y  ^" R: S% m
    [size=1em] pInterface1->func1();2 k7 g, [2 P/ r5 L# D. j1 L

    ' K8 o2 R1 S6 A, p$ S
    . F$ Z6 j2 e, I) B! _
    / w, `& O, \( t9 r* T
    * y( g0 @1 r$ W. J6 |

    3 c5 n/ e8 |, i5 Q$ E
    5 L9 ?) R5 I4 {: d              C++编译后,Base类的虚函数表如下:
    2 L% z# Q$ W3 E  L+ j+ }2 n7 Y6 n[backcolor=white !important][size=1em]         PHP code$ E& N' f5 N- m
    [color=white !important][size=1em]?

    * Z+ f( Z- w$ C5 e/ h
    [size=1em]1
    - r- f6 Z: S9 s& E4 R1 f6 x
    [size=1em]2
    ; j+ R1 C* @0 }9 [( H  S9 f% @
    [size=1em]3

    * W  W9 s7 J9 o, j! b! q
    [size=1em]4

    , E5 N( U0 S7 o0 B. c% K5 Y% z
    [size=1em][size=1em]  
    / {' J9 n5 h: R8 d% y3 ^& w[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    ! R# h: z  A8 y3 o3 H, D[size=1em]  vTable:InterfaceU1 |Base::func1()|) ]) o0 G* e4 X  K9 ^
    [size=1em]  vTable:InterfaceU2 |Base::func2()|4 U& N3 q; H) l' \0 T3 P& P6 Q
    & P8 i, W, X0 I& Z: j; }. c

    ' D/ E7 Y1 D6 _" W1 s" Q# J0 ~* }0 S/ d/ {2 u- l$ q/ d
    8 A6 p5 k; v% d; ~. N  Q

    $ T" A; Y' J8 X" X6 n% [8 H  w     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。2 N& I: i, ~2 {
        但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。) V5 s# R/ u% p& T7 U1 t
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?# ^& d6 |8 f% k8 ^" v% T5 Z
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)$ n2 r. X  H& U4 T; c- ]. r

      ~. ?/ b# i; N
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-5-26 16:44 , Processed in 0.325857 second(s), 50 queries .

    回顶部