QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1671|回复: 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
    : [7 E) C, z  I[size=1em]      InterfaceU1
    4 o0 {0 T, j+ M$ G+ W) W  c[size=1em]  {
    . ~" U8 X) g3 s, @) N[size=1em]  public:3 i" }; z; S- F$ U5 W1 _2 B4 P6 b% Z
    [size=1em]      virtual void func1() = 0;( G* O4 e/ T" Z8 Z
    [size=1em]  }
      p# S5 L- n# D$ b0 W" W3 Y' y% y( m' }) @) }( A% Q( G
    [size=1em]  class
    # r3 y& \8 N6 a[size=1em]      InterfaceU22 Y: T! n' K3 N# a0 c3 E8 |4 B
    [size=1em]  {% O1 y0 ^" E$ q) ~8 A
    [size=1em]  public:4 R# T- J" x, @; j, G
    [size=1em]      virtual void func2() = 0;* G$ Y8 B( A/ `5 y( p9 J! ?/ f. D3 c
    [size=1em]  }" l1 @0 }9 K9 l% {# |- `

    % f8 K9 W, a) @% Y[size=1em]  class# P/ v# e) t2 Q6 L2 e
    [size=1em]    Wrapper
      ^. l  x! J9 x) O4 q0 S/ p$ d4 z! b# J[size=1em]  {
    / J/ _! h# O2 {) p( i  z8 e6 l[size=1em]  public:* I4 {# p2 n# e7 `6 X
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;
    6 U  e, |$ ]2 R) N4 f2 d[size=1em]      virtual InterfaceU2* getInterface2() = 0;
    ) q8 p; g# H4 ?& F1 D[size=1em]  }9 F, P' O9 G1 |. I5 _

    0 R$ e  j( ~0 q$ u" b[size=1em]  class, X! f8 y8 R: C( I& q% K- k
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2
    7 c. @  V6 `0 F* u[size=1em]  {1 _5 V" o& L# `. P: M
    [size=1em]  public:
    & ^0 u8 _/ m  Y! U[size=1em]      virtual InterfaceU1* getInterface1()
    ( ^, i8 a# h* @" b4 w[size=1em]      {. v6 M) h! z+ F) T: d1 u! C3 B: d  e
    [size=1em]          return this;
    - H3 s! R6 f$ r9 l: o[size=1em]      }, J. d# `/ R+ t% V: M5 S
    [size=1em]      virtual InterfaceU2* getInterface2()
    * }" k. n% x# c# y8 [1 h[size=1em]      {
    1 C% r  n/ M0 ]& Z9 @- v
      K5 z5 _* o" j[size=1em]          return this;
    6 I# n2 [) X, n7 k$ F( c& X' f) _[size=1em]     }- {. t3 s/ m$ R" i
    [size=1em]     virtual void func1()4 l8 D7 ~0 Z0 A0 S+ [2 I: c6 D% B
    [size=1em]     {
    3 Q: R9 F2 U0 k5 Q% X6 Q[size=1em]         printf("%s", "func1");
    3 s, g' B, z* Y2 S& [" m$ C[size=1em]     }' H8 U7 Z5 T- k% o$ E) z# l4 h
    & p% k2 i' U7 V+ o
    [size=1em]     virtual void func2()
    2 W, R4 R, f" q[size=1em]     {. d) K* Z; p  [. \
    [size=1em]        printf("%s", "func2");
    8 ]2 W, W: g9 O) n; A[size=1em]     }2 D! }+ j0 j  b, ~7 o
    [size=1em] }. @8 h- w) D! b
    " |: e" T, Q" A" X3 ^' e9 I, c) B
    0 P& r3 U( y+ X0 _
    : w( b% R/ H" l. F5 I  Q
      e2 _& O/ s' M8 c
    假设有如下代码:
    8 I/ D# D& O) r* ][backcolor=white !important][size=1em]PHP code7 W# m9 w# o7 ~2 _5 e, N: M+ I
    [color=white !important][size=1em]?
    ( |! S$ Q! S) l" l5 E- Y$ y
    [size=1em]1
    0 V* c, q1 g2 |) O+ j
    [size=1em]2
    $ [5 w, K+ c- Q: D1 \  O2 V
    [size=1em][size=1em]Base* pBase = new Base();$ V- H* L5 L" i) F
    [size=1em]pBase->getInterface1()->func1();
    ( M# H: l, z9 B# a$ R* C# F4 G7 y6 m: T) `; Q2 u7 t
    " _$ S# z' x/ |' a: ]& x  H

    4 S# y# q$ k2 l0 O
    9 o# I; o  Y9 T( U! s7 [: E% g其实以上代码等于:$ O: o8 V% ?. f% {' k
    [backcolor=white !important][size=1em]PHP code
    $ w( V! d9 K. F6 S, N: \2 z9 l
    [color=white !important][size=1em]?
    ' Q9 R+ d9 \. ~) i. j" j4 H
    [size=1em]1
    9 z2 [8 V0 R3 d1 }% v
    [size=1em]2
    2 `6 v7 s/ t/ y  H8 w4 I
    [size=1em]3

    9 ]6 d- a& k4 {6 `% I" ^$ Y4 f0 _
    [size=1em][size=1em] Base* pBase = new Base();- w" M9 L! \8 S: R3 ?7 ^. ]( l  T, `
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    * j* P$ S) t  e: q: K[size=1em] pInterface1->func1();8 T& n: p  P- b+ d" c

    1 Y& G1 c% Q2 b2 K, b

    , g$ f! O& m+ ^* G7 q
    4 _& j: D; w6 T- ~0 u
    & R( M1 K* x$ I
      y8 `" P2 j9 l6 V& F& M! D0 l$ ], ]! Q3 E3 N
                  C++编译后,Base类的虚函数表如下:# }; M& {) F, w0 r, n! c
    [backcolor=white !important][size=1em]         PHP code4 m' Z# t. y, H
    [color=white !important][size=1em]?
    ! {# e2 ?# E7 P2 _. ~& T* a( r0 |
    [size=1em]1

    ; }5 h6 c7 g4 H8 x& t! c
    [size=1em]2

    + ~/ ?4 R% @3 g; Q& g
    [size=1em]3

    & M5 ?8 V4 \4 Y# {" o
    [size=1em]4
    $ v8 ], Q( ]6 q7 n) Q( ~+ T; A
    [size=1em][size=1em]  
    9 {& P9 |% {* ^; V+ m, B[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    4 f" y2 z1 s" \8 v[size=1em]  vTable:InterfaceU1 |Base::func1()|
    % E' }9 G& _( u; `& x[size=1em]  vTable:InterfaceU2 |Base::func2()|6 p; Y. x3 _8 m% O; S* j
    9 s9 }3 a. j) r1 h

    / G2 \+ L9 z* l( C4 G  [9 D
    ' Y  M, |5 s. ?$ f
    6 ?% z+ ^1 ?2 M( K  a6 B$ x( E6 b8 F" O
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    . Q7 Q; d0 \' w( V5 V    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。3 B. D. A. `, o3 W) k' l0 O
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?/ S: ]2 g& F" p
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    ' E. w+ J- k) O! L( I1 m$ ]  ]1 I2 q/ I& Q. M; y3 r
    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-6-17 17:26 , Processed in 0.615095 second(s), 51 queries .

    回顶部