QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1701|回复: 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
    : S0 E8 Y3 Y5 g8 L7 C[size=1em]      InterfaceU19 l9 ]2 h5 ?9 Z
    [size=1em]  {* D) l# }9 ?  R- l6 D) [& b
    [size=1em]  public:
    7 p( z& z+ K3 v[size=1em]      virtual void func1() = 0;
    ) n2 F$ z9 g" n+ u$ I[size=1em]  }3 p. N# b( \' e7 A4 y3 E" i% m

    8 `* ?# q( r5 n# ?! C" P[size=1em]  class# g, P' q5 C* k' I. r
    [size=1em]      InterfaceU2
    , T" g5 d( i7 K$ {. F[size=1em]  {
    ) H6 A) P- Q4 x9 V$ r, x[size=1em]  public:
      J' Z( Q8 r3 x) y) j[size=1em]      virtual void func2() = 0;
    4 Z, J- M0 t3 I8 {[size=1em]  }2 J4 {0 U6 i) f( y% k. }# C
    - c9 m4 J* M- u# \! A  E
    [size=1em]  class
    ( _# ?; Y+ ^) o) o2 K/ p3 ^+ q[size=1em]    Wrapper
    ! A: Z. M5 l! n- Z[size=1em]  {- {% K: O# V: a/ X7 j. P- X/ g
    [size=1em]  public:
    / r7 I# C2 Z+ g/ Z8 I- M+ o! _[size=1em]      virtual InterfaceU1* getInterface1() = 0;
    3 a2 X  w5 q. o; d[size=1em]      virtual InterfaceU2* getInterface2() = 0;
    1 V! |& Y1 B% g" p[size=1em]  }7 l0 k0 ]# g8 j8 i, W

    6 G  h9 g. h2 z- }( E( _3 O[size=1em]  class
    2 @- w4 i4 T' w) i[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU21 P* `: C1 J0 _7 n
    [size=1em]  {
    ) |3 }6 k5 m8 Z: i0 P3 f, @[size=1em]  public:
    ; x) V+ U5 g/ |9 m[size=1em]      virtual InterfaceU1* getInterface1()
    - q( K  d6 w- O[size=1em]      {# U) _  k! V& ^
    [size=1em]          return this;7 q; K7 `0 H. o* W" q
    [size=1em]      }+ B; I9 L7 |0 w. b5 Q3 U6 G8 Q
    [size=1em]      virtual InterfaceU2* getInterface2()8 K4 p8 U% b/ c4 P& h9 ]. A3 L
    [size=1em]      {8 g' w/ \' Y8 A, M- D
    : y4 u: \8 e0 j7 g: T9 Q) l
    [size=1em]          return this;0 M1 Y+ H9 B' E
    [size=1em]     }
    7 \1 L2 i& z' A/ v; D0 K7 X8 [9 J[size=1em]     virtual void func1()
    $ |; C5 V$ M' t& l2 b" }" U8 P[size=1em]     {2 h& r  E8 a3 z/ T" t  h' S' L
    [size=1em]         printf("%s", "func1");; Q7 x( M" u" s, d2 Z; v2 u5 {
    [size=1em]     }
    9 X9 v4 D0 n9 W" s
    5 U8 I; ^3 N! I8 l% r[size=1em]     virtual void func2()
    ' H) B* t- W; `7 [, z[size=1em]     {# j- R& p8 h: L& x- m
    [size=1em]        printf("%s", "func2");6 w2 O) x5 }5 m$ U
    [size=1em]     }
    ; O! j5 ]3 V3 J. m& |+ A: h/ q" H1 J- @[size=1em] }
    4 L% T" d3 i2 M' v
    $ z8 s1 d4 m0 L$ c9 D

    - R! Y- i. H5 }
    6 [# p  {2 D: [3 z5 H, H# g% r
    1 u( d( G6 z0 j8 N
    假设有如下代码:% P9 i  \7 m# ^  M9 X* B
    [backcolor=white !important][size=1em]PHP code) s% O# U0 @9 ?6 z2 Y
    [color=white !important][size=1em]?
    2 T' V" i; z5 l. x* s
    [size=1em]1
    3 V  \; ?( J% z+ N) k; f
    [size=1em]2
    / i1 y, M) ?$ n2 A2 v; M5 L
    [size=1em][size=1em]Base* pBase = new Base();
    9 }! V+ ^. E" g0 b[size=1em]pBase->getInterface1()->func1();, ]5 U! E6 `# }9 Q* P
    ! {& g; m& [" Q$ T1 v0 v: T5 k

    ! u3 T' D, Y# l! S/ I) N+ y# B9 E1 M; k

    ; {3 F& p5 v6 W% R其实以上代码等于:* y& s- G2 A9 _  R5 f9 Q
    [backcolor=white !important][size=1em]PHP code
      R' L, e# f, B, `0 Q, ^
    [color=white !important][size=1em]?
    3 k0 Q+ T8 H& G, ^
    [size=1em]1
    . o/ W# \) S) L" R5 }3 J  X
    [size=1em]2

    ( s; q3 P" N, @2 R! L7 r* T
    [size=1em]3

    + o+ W) u3 ]6 b) H" e- z
    [size=1em][size=1em] Base* pBase = new Base();
    ' \  W  O& C0 t2 K[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    & u1 z9 ^, h  K6 F[size=1em] pInterface1->func1();; U# h- r6 _3 {

    ! y) W) u3 B" m9 C' D+ b1 O7 _( C: j9 t
    $ f& r3 t) ^* G

    - X6 j$ _9 \6 [. e0 p) W
    * b' [7 w5 X1 j( Q8 ]: f+ d* f) Q6 x2 U1 ~5 t. J+ B
    . @7 ?* |$ D: K8 o# t0 x
                  C++编译后,Base类的虚函数表如下:( w3 i8 W4 R0 L2 G; s; U( R: @3 R5 H
    [backcolor=white !important][size=1em]         PHP code
    7 c( h1 l1 P; U6 z) W  F
    [color=white !important][size=1em]?

    % j; ?  v3 [; I/ G
    [size=1em]1
    , f$ ~' c& q. {+ h! A1 Z1 x$ ?
    [size=1em]2
    & [' o* s5 i2 R5 I( D. d+ v$ e! a
    [size=1em]3

    # ~9 ]  ^; H+ P+ ^( k$ N5 r: Y; ~9 J
    [size=1em]4

    7 d6 @8 B: F0 x( a( ^
    [size=1em][size=1em]  , Q4 m3 C  s* [. q. `
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|9 X+ Y. Y# T6 L& E% u
    [size=1em]  vTable:InterfaceU1 |Base::func1()|
    , D7 h+ f& e6 Q+ q" B. [- }! u4 N[size=1em]  vTable:InterfaceU2 |Base::func2()|* _) h$ k7 ?% W3 m; w2 ~3 K  ~
    $ y3 n. {& `; j5 Z4 `

      u/ _+ ]3 `! N$ v* j* C) J8 W+ j2 c: q" |! s! ^

    . R# ?" [# Z# p. ]2 |( n- s. a+ @
    0 V( P8 T( T+ t% q& H     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    " u& D) u/ F0 g9 [, Y    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    4 _: {3 g4 G7 V4 T. \9 b    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?. k: X7 L% s  ?$ l2 F9 v
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    ' E  m) q5 ?  i) i. v7 X
    - y, n" k, V. G# H+ p
    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-8-5 04:06 , Processed in 0.391158 second(s), 50 queries .

    回顶部