QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1633|回复: 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
    4 ~* Z- Z4 |  ]% \[size=1em]      InterfaceU1
    . S# V  m  O! n) k[size=1em]  {  {0 C* h2 C( @5 Y
    [size=1em]  public:9 m! H  p& r' g# w) E! J
    [size=1em]      virtual void func1() = 0;
    - N, Z) A2 r% e: R8 o[size=1em]  }" I0 L  e. s4 g9 }% ~

    . X8 O  E9 v+ t" F3 e[size=1em]  class* s5 K" a: n) ?2 c! y+ h
    [size=1em]      InterfaceU2
    5 G* @* \8 M+ W) B, T% E[size=1em]  {( M# f6 I1 a+ y  K( Y& I  t% l0 [  m
    [size=1em]  public:
    1 i% p3 G7 B" b& B5 A[size=1em]      virtual void func2() = 0;$ k3 l) W$ l% F$ C
    [size=1em]  }
    6 a6 Y5 h  F5 i- I, O
    ! S- e8 |/ Q/ q) N" T7 b. T% N[size=1em]  class
    2 }: V+ l; f9 J9 N/ k. A[size=1em]    Wrapper9 x' d# ~, U- {' s( n$ Y+ l
    [size=1em]  {
    ! @9 V3 w' M; V, v7 F[size=1em]  public:8 P3 o8 H0 w( m2 P2 u" p  s
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;8 N* a$ _& @, ]+ d
    [size=1em]      virtual InterfaceU2* getInterface2() = 0;
    ! _2 `# |3 m8 a[size=1em]  }
    - b- A) D4 z, l+ V" ?
    0 |2 \- u& X' g& z- ]( T[size=1em]  class
    & D" r9 t% |9 E* B3 [) q[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2. `" {( Y9 e( F) r$ N& v% u
    [size=1em]  {) N$ }4 r" E8 h* h6 \5 U' {  a0 W* q0 H
    [size=1em]  public:' D0 G  f( k  K4 Z+ U) g
    [size=1em]      virtual InterfaceU1* getInterface1(), B0 F8 i  q3 r! u
    [size=1em]      {
    3 m' g1 I/ X: {+ b; q[size=1em]          return this;! ^* W5 U8 Q0 Q% ~" O+ \- i
    [size=1em]      }
    1 t: m  A/ F6 e/ ~9 n. q[size=1em]      virtual InterfaceU2* getInterface2()
    , F$ t# w$ m/ g+ b# U$ H7 x) ~[size=1em]      {
    7 @6 x' A3 u9 O7 l' f3 P8 n1 e5 N, M& W( h) \4 e& H
    [size=1em]          return this;" b* R7 z0 t% Q& [& i$ u
    [size=1em]     }$ R! X9 J7 K( I. k) N( \
    [size=1em]     virtual void func1()
      l2 B2 P% R6 a+ ?4 v[size=1em]     {
    - f1 d* ~) s* ]. `4 S5 x[size=1em]         printf("%s", "func1");# W8 ^( r4 T0 }# O
    [size=1em]     }
    * X# H, q; t8 L3 |5 f+ O$ F9 R- L. ^: l+ z5 a$ h2 h; D" u; R
    [size=1em]     virtual void func2()+ X2 y, s1 n% U3 j7 b' h; h5 o
    [size=1em]     {
    * U1 i  [1 r) h/ s; q3 ]; O8 a[size=1em]        printf("%s", "func2");0 m" S" Z+ R$ V3 e
    [size=1em]     }3 s2 R, b0 L) K6 \' t, ]8 F, F
    [size=1em] }7 X8 O2 X& G/ i% |4 Z4 G
    & e) _+ ]1 D6 O% E
    ( `/ A3 Y+ K7 i7 f
    : ^9 H0 C4 B6 S3 Q5 a
    3 W. J9 s- H2 f9 J1 `" d
    假设有如下代码:/ g4 k# K6 ?+ M% e
    [backcolor=white !important][size=1em]PHP code
    * s0 C( F  [  z. n
    [color=white !important][size=1em]?
    4 z9 n+ R, l( i$ m' J! A
    [size=1em]1

    ! {2 v6 l& F$ s  z* W$ M
    [size=1em]2
    & J* x! O% t# Z' h) d5 _$ a
    [size=1em][size=1em]Base* pBase = new Base();- Z7 Q3 t: w) e. {3 L; u2 C$ S
    [size=1em]pBase->getInterface1()->func1();0 J* E! i( E1 x6 k6 }" P

    * ^' Y* J" d+ b# S, C/ x# j

      k+ y" _/ }, }( P! [# r
    5 m, E( b, _' Z4 l# t+ ?- |( @- S4 o  g% j& r
    其实以上代码等于:
    & I+ m; h, a7 F! c/ |/ w[backcolor=white !important][size=1em]PHP code! O6 p: |# l" g: u1 a
    [color=white !important][size=1em]?

    : p$ U$ W1 O2 U' s) v: h
    [size=1em]1
    ( ]4 Z3 h0 @, h, X1 I/ ]2 D4 h1 e
    [size=1em]2
    2 I6 D+ U2 f% J+ G9 j
    [size=1em]3
    8 @, r2 W9 L5 k. v2 V7 N+ e
    [size=1em][size=1em] Base* pBase = new Base();; l$ Q! e3 l7 B6 v" A2 ~6 E# u) H
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    3 f  z9 q6 b( B* [; ]+ K[size=1em] pInterface1->func1();
    6 S( Z& ]2 w. v7 V" X* s" z; t! E) ?) m  s

    5 R  G! E# r( p$ M
    . d5 I% m: p$ q# j6 Y, P5 }7 ?! \
      _! c5 I& f' l9 F. l8 N4 s$ b- |! b7 \. D; {3 y; K
    ' X8 X, S! a7 a
                  C++编译后,Base类的虚函数表如下:& `6 q+ @5 o& a- B' a
    [backcolor=white !important][size=1em]         PHP code
    3 _7 v3 e6 ~  e) @/ s
    [color=white !important][size=1em]?
    ' ~3 [: d$ g+ S) x8 Q
    [size=1em]1
    . f5 r9 b; p: M5 c' c. y
    [size=1em]2

    3 I1 u6 j; S3 v: d9 K
    [size=1em]3

    0 f1 G# J6 Q5 f2 ^: ~) G
    [size=1em]4

    ) W0 a& F8 O  W( e
    [size=1em][size=1em]  + N9 N" K3 W4 X& ^
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    4 ]$ L7 U- \2 ]+ w& h! K* u! [[size=1em]  vTable:InterfaceU1 |Base::func1()|
    $ m1 @/ ^% n+ V' r[size=1em]  vTable:InterfaceU2 |Base::func2()|
    + U) C/ L. F- N/ {
    0 I4 u3 T3 F2 j% j4 e5 o

    9 K; J$ u( G, i6 m8 g  W1 O& U& M$ U6 y# W, v/ d7 O
    8 a( R' C+ J5 `, T; Z
    3 I3 r% e5 @4 |$ D0 R& M
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    & e8 [1 G  T7 ]) P    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。' x2 `* s# ?& @. m
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?. W. ?+ g9 Z2 S
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)% k" C: P0 E- v6 v
    3 q4 s6 k$ e7 [5 ^1 Z. B" A
    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-4-16 04:07 , Processed in 0.431665 second(s), 51 queries .

    回顶部