QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1715|回复: 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]  class0 E* d5 |' X1 Z! N
    [size=1em]      InterfaceU1
    7 g% V3 }( Q! H[size=1em]  {# R: g" ~; u4 J9 J: w
    [size=1em]  public:1 C0 o- l1 L; F! r3 ]  s) w
    [size=1em]      virtual void func1() = 0;( \2 C9 P/ t. G7 e" w# D
    [size=1em]  }
    # [7 B' ~$ \  s8 Y. h; N
    ; `2 ?/ \  S, p7 m+ Z/ \6 j[size=1em]  class1 J0 Q/ O+ |; R" O
    [size=1em]      InterfaceU2
    7 y# I" @( b( S[size=1em]  {# j$ P- p' P' S6 G$ B
    [size=1em]  public:8 J5 r+ }+ |( D% V; X- Y
    [size=1em]      virtual void func2() = 0;' n2 U5 O" Y  q2 N& d" b0 F
    [size=1em]  }. \: K  N% a: ?$ |* v

    2 i9 f3 {8 X. x/ B  f) D+ E% Q[size=1em]  class/ e% c1 ~) \5 k/ q1 S3 R1 `- ]
    [size=1em]    Wrapper" ~  G4 f: N$ d0 `
    [size=1em]  {9 e6 `$ d  C- i; U. D& b% j
    [size=1em]  public:, \0 S2 O: [: J, q4 W0 B
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;
    8 X- ]2 ~) g5 B) ^1 ]( r# s& W3 V[size=1em]      virtual InterfaceU2* getInterface2() = 0;
    7 F' C7 X3 y/ Z[size=1em]  }
    8 |& z( m6 D5 h7 I7 G% o/ a0 r) ?) k  f+ }1 @) t# Q) C
    [size=1em]  class8 L+ H; V" d" _+ |( E1 C: q. H
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU22 E2 G, Z- Y! |; U" ?
    [size=1em]  {% A. M8 w1 ]; F# }* Z+ R
    [size=1em]  public:3 g. Z! A1 H8 {1 s* C
    [size=1em]      virtual InterfaceU1* getInterface1()/ h6 }) A8 z5 h$ g5 a# `2 ^
    [size=1em]      {
    6 P" o' y, C% G/ ]* p- ~( V[size=1em]          return this;
    0 o9 h) @3 P, [- b( N. z[size=1em]      }4 B- n4 D( w& x! k4 @
    [size=1em]      virtual InterfaceU2* getInterface2()) w- P, S0 p( M- G' C* L' C2 F
    [size=1em]      {
    - `( \& g( K9 ]6 ~" r
    ; r2 r9 Z+ M3 M* r[size=1em]          return this;, y% \7 v7 e& t) y) S5 N3 G' L. X8 R
    [size=1em]     }
    , x# u) O( ^- K8 W[size=1em]     virtual void func1()
    9 g4 \! [; K$ d; G# e5 O[size=1em]     {
    ; C, B* j, ?! X9 b4 h$ d/ ^; u[size=1em]         printf("%s", "func1");5 ?% q- L& j, s0 K6 Y* L% O6 W
    [size=1em]     }
    & j' K& h) a9 J; I" Q+ Y: M( l) {, a# F
    [size=1em]     virtual void func2()$ v: d$ k/ @! N* n
    [size=1em]     {
    . b% y7 e1 G/ C+ M[size=1em]        printf("%s", "func2");
    1 J; u; V8 q% {/ i* ?% i[size=1em]     }
    9 ^# x' `$ p% D, ~- b[size=1em] }
    5 J& Q) D7 i8 o: B% K6 H4 V. N' a* r& Y8 o: l

    8 \- \/ n) [$ ?# ?# q, e

    ; U6 k% L; |7 A6 W+ ?
    2 c; ]4 @! k( b) K5 J) G( G- p假设有如下代码:
    1 ?% K( C# C4 C! v% [[backcolor=white !important][size=1em]PHP code
    ) x  ^  y' Y3 q* v
    [color=white !important][size=1em]?

    ! D$ B2 ^* I- F  O: W1 S. x" K5 v3 z; \
    [size=1em]1

    0 r- F* R7 c6 k4 W$ |
    [size=1em]2

    * N# q2 U( f2 X$ |/ @. k1 t/ @( l
    [size=1em][size=1em]Base* pBase = new Base();
    ; f5 g% h  `! l$ @3 Y6 ][size=1em]pBase->getInterface1()->func1();; I" {8 w0 `4 u7 e

    ! q; N3 ]" {/ V3 c

    : q) Z/ \" B' w. f4 K/ [$ A6 K# f& Z; p- ~9 q

    1 c( |! y& P* ]其实以上代码等于:3 Z9 B0 c5 ]# _" K& ^
    [backcolor=white !important][size=1em]PHP code9 u" S# t: c6 f0 E, `/ ?
    [color=white !important][size=1em]?

    . _/ Q  I+ ^+ ^$ @# F
    [size=1em]1

    : z0 P5 |" x( e
    [size=1em]2

    , Z5 b, d9 [- D
    [size=1em]3

    5 i2 c( g8 r5 c7 B% h4 l: z. g
    [size=1em][size=1em] Base* pBase = new Base();
    ' |; I2 o8 V2 m+ ]' m[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    4 B: _9 l& {2 j+ O0 x' q! k[size=1em] pInterface1->func1();
    % D& Y/ F2 e1 f6 \- f' y) r
    + X* M- m$ O. Q: p, ~5 b! Q4 |
    8 U' H0 ]( |) k6 t/ {+ S

    8 r% n* Y6 k  o
    . F6 l$ Y, X- i; I3 a. i
    1 ?. t& d& ^# c5 n- n7 [/ c9 J) b' _3 {/ h
                  C++编译后,Base类的虚函数表如下:
    / S& l. _. m  K[backcolor=white !important][size=1em]         PHP code$ H1 \+ Z4 \3 U" T
    [color=white !important][size=1em]?

    4 J5 P* K. ]+ i4 J3 I
    [size=1em]1
    5 @* L: l* C; R! B/ g8 e
    [size=1em]2

    " z3 u* h( q9 T
    [size=1em]3
    - d1 g: I& ^- R  j$ ^# @) f
    [size=1em]4

    . v+ W9 W9 H- u- ]
    [size=1em][size=1em]  
    , ^* \+ M0 P, B[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|# [& H  M0 w2 a, G7 e9 H
    [size=1em]  vTable:InterfaceU1 |Base::func1()|; m0 h7 t' o( O7 o* h
    [size=1em]  vTable:InterfaceU2 |Base::func2()|& ]4 F+ b2 r" i' v

    $ V6 i4 K! j8 @8 s; l4 i- z' O
    " o6 S- f# y9 B% B. X, B" B+ A
    * U% n! K4 l- B) l* X- M

    ; z2 `$ K/ b2 |0 j" o) U8 v/ \( d. ^  S" |- z4 R) O* f
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    ! D5 S2 d5 I" R+ y+ W8 ^' u; w; s    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    % |/ X2 p$ {0 m    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?  e$ V: M% m$ M( Z
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)1 [$ C5 [, n) }
    ) F& M! ^+ P, o8 M4 N' E: a+ e
    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-9-1 14:40 , Processed in 0.847754 second(s), 49 queries .

    回顶部