QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1717|回复: 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! c; Y0 G/ d+ K: M
    [size=1em]      InterfaceU1# b2 o* G% P+ y- Z$ I
    [size=1em]  {
    + z1 r7 P; s' ?; c2 S[size=1em]  public:# f0 j- Q& O# N% g$ F
    [size=1em]      virtual void func1() = 0;, `7 y! }3 x5 C" q  _
    [size=1em]  }6 Q. m- _4 P. S* w% c

      P2 I4 P7 ?8 I7 [5 k[size=1em]  class0 A3 P1 [) s* B* \
    [size=1em]      InterfaceU23 G  O# \" r" l2 t4 @% `
    [size=1em]  {
    ! ]' M; Y: J8 `) Z  a" h0 H6 B0 w% x[size=1em]  public:3 r4 O4 t+ R2 \- r% l# S
    [size=1em]      virtual void func2() = 0;$ `" Q9 `6 n/ o" ?/ g
    [size=1em]  }  s6 e% t/ r/ M( T- i

    # l% @1 c% X5 n  [/ s[size=1em]  class" S' [2 E; T! ]8 {
    [size=1em]    Wrapper
      z# T% c" r2 o9 [% W[size=1em]  {
    2 r) J- \& d# W4 D[size=1em]  public:! S4 N' e$ ^/ w0 S7 C
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;
    $ Y+ c& T, x0 R* Q[size=1em]      virtual InterfaceU2* getInterface2() = 0;: n) R) ?8 T: d! L
    [size=1em]  }
      p: E6 d' O$ v: o. v2 d0 L5 @8 x+ ^
    [size=1em]  class3 L; q1 E5 q% Z  F' I
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2
    ( U+ G1 f9 i. Y6 B7 c[size=1em]  {
    $ ]% I  }" A) b$ p6 h9 [[size=1em]  public:" g# _- G' x& j
    [size=1em]      virtual InterfaceU1* getInterface1()
    # H$ K: W0 o8 E( o* U: ][size=1em]      {
    3 }- r2 x8 O6 S% _$ c& c[size=1em]          return this;
    3 W$ E: r% t& x- m1 [[size=1em]      }2 i7 y8 a6 ~* S. S* v
    [size=1em]      virtual InterfaceU2* getInterface2()7 O: |8 Q* G( ]4 _5 P; v- H
    [size=1em]      {
    ' v3 e: `6 Y' h2 L/ g. H; O7 F$ w" q7 Y- x& p: F0 A
    [size=1em]          return this;) D0 N. `" R& m- m
    [size=1em]     }8 v: _! f2 U! L# _+ _. @$ |: n" p
    [size=1em]     virtual void func1()
    ; N& h1 ~+ J2 z; `" _[size=1em]     {
      ]5 b/ P( l2 `[size=1em]         printf("%s", "func1");
    9 k7 [# o/ \2 i) z[size=1em]     }; I- L; ]! l1 C$ F  U
    ! @) z5 Z) [7 P$ ^+ z2 \0 R
    [size=1em]     virtual void func2()4 l5 ]; e: K% j" M% w
    [size=1em]     {* f6 [6 J9 _  E& I! G! C+ J
    [size=1em]        printf("%s", "func2");
    ! Y4 C) \8 d9 p- E[size=1em]     }! ?; O0 l( w( T; T4 X: g& l& Z
    [size=1em] }
    1 i* n: a- h5 Z& y7 J3 ~9 V0 E
    0 H6 u3 l2 M+ x0 f4 q: U4 V
    $ p) v8 Q3 [' o, o$ I4 T
    0 E* A% U  [5 Y9 b) [! e( ?( E
    " l6 h( R9 m. t4 C5 g' f
    假设有如下代码:  ^5 O$ J$ R* w/ {9 f
    [backcolor=white !important][size=1em]PHP code( {  P+ d% Q" z/ [& U% j5 M! u! [
    [color=white !important][size=1em]?

    ' \3 i8 z( q2 `8 j9 m/ }/ o* Y
    [size=1em]1
    ; n8 W7 `, P# V, C* y
    [size=1em]2
    % y$ J5 m" e8 c* r/ y
    [size=1em][size=1em]Base* pBase = new Base();" C) e' t: d9 z% \" I" j7 y7 W
    [size=1em]pBase->getInterface1()->func1();: w  r( l$ y6 N; r3 Y" o# Y
    / T/ J' ]$ W" ~& S

    : M0 `1 ^" C7 W8 C) d% M5 j; V0 x& j9 M# n" b

    - Q, }% U0 m$ b1 D- }9 U* A) \其实以上代码等于:9 M& d0 x& `9 N  `  x
    [backcolor=white !important][size=1em]PHP code
    7 I2 B. ?9 V) T! U9 D8 x
    [color=white !important][size=1em]?

    ; g7 j. h" i' ^' `' i# @
    [size=1em]1
    + x$ f0 v! `2 u# ]1 E
    [size=1em]2

    ) A* b9 z; y" s3 j" M! I
    [size=1em]3
    7 H( M9 ^5 d& C+ Z+ V: B" j5 d: Q# t
    [size=1em][size=1em] Base* pBase = new Base();
    + g/ Z4 P& {' y: M, Y[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();4 z/ Z/ ^9 P# A- a
    [size=1em] pInterface1->func1();& _3 d! X0 i+ w  v* u; P
    6 [& |: f" g% x# ^8 n1 L4 Q

    ; u9 \* y/ e* [  Y7 G+ X" ~# V* f: u4 Q: l- m" Q+ ]/ p9 I: r4 G
    9 k# ^$ H4 O  T* ~
      p8 q6 ~4 H$ m/ Z1 f
    4 s" h/ F) r3 g
                  C++编译后,Base类的虚函数表如下:
    5 c& y3 t$ A! a" k[backcolor=white !important][size=1em]         PHP code) e. g) t2 `# ~! t' |4 i
    [color=white !important][size=1em]?

    / \2 e! s, E$ p; M; O: K
    [size=1em]1
    2 x7 m9 d# g! [6 [& Y) M
    [size=1em]2

    0 L! ~- W8 V4 R" @5 e5 Z9 v
    [size=1em]3
    + {! B, I  z3 e
    [size=1em]4

    ' v  _! ]5 N/ r1 W" E2 H1 E
    [size=1em][size=1em]  
    7 Z  L. z4 |* A# t9 ~" S[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|: X2 l8 ]6 T1 w1 q+ G
    [size=1em]  vTable:InterfaceU1 |Base::func1()|% n+ \& P. N, e$ S0 S
    [size=1em]  vTable:InterfaceU2 |Base::func2()|0 N, `; G+ V- d; }

    1 e8 a" ?% a, k1 z0 u0 [

    4 n! j: G: a0 l; e, H) Y' `! v$ T8 G, h+ H
    1 S. r3 W8 h5 @* V9 x
    $ Q6 H  M" f( q8 |
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    # B( s' m6 S) C; Y; k) E    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    0 T6 m% K1 K# p6 B4 r" y    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    8 h7 v* z- o  r% d: s9 W    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)! c6 b+ m+ E4 H4 q2 D' K) M
    % }; s1 j$ ?8 P* c: g& 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-9-1 18:04 , Processed in 0.726065 second(s), 49 queries .

    回顶部