QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1687|回复: 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  X- u. s# n$ [; l' m
    [size=1em]      InterfaceU1
    : g! |( q4 u9 X$ w[size=1em]  {4 M3 h, c. _8 D# e1 i7 w) P0 K( F8 E# c& o% j
    [size=1em]  public:
      c, c3 v- [3 m/ I2 w% U[size=1em]      virtual void func1() = 0;
    4 w9 }, A) H/ P' D[size=1em]  }
    , [: k* J/ V# A  E" T+ a7 S& b4 Q" P: T% }- T/ G
    [size=1em]  class8 J  q* J, W; h. q' H
    [size=1em]      InterfaceU2% s: }% k) V! |( {
    [size=1em]  {0 O4 _- ~, R, E4 _
    [size=1em]  public:9 Q8 U  I" U( F
    [size=1em]      virtual void func2() = 0;
    . D& g. z0 k8 H; Q9 h  \[size=1em]  }
    4 b3 T& K& q7 D5 R1 n" n( [  G2 n3 r  P9 @4 J/ S0 `( A( u* e
    [size=1em]  class
    1 }4 ?9 W- X: s% H, E, N[size=1em]    Wrapper4 d8 Y7 }- q$ [' ?& O
    [size=1em]  {
    : J, J' [4 n: L[size=1em]  public:. N& E/ E7 `/ U# Z7 s/ s
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;. c( |' F7 o/ B- _5 T+ t  k
    [size=1em]      virtual InterfaceU2* getInterface2() = 0;6 l& Z+ ?+ B& C! o3 d6 M; Z. C0 Y' O
    [size=1em]  }
    , E% W1 t& N* s8 t* T+ D( q1 Q# Q3 W( E
    [size=1em]  class
    ' G! g1 ^  x& o, }0 E4 U/ t[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU24 P( P# E% d# J( q9 K
    [size=1em]  {
    # R$ V# K4 t! |, G[size=1em]  public:$ h* ]1 w9 y7 _+ C
    [size=1em]      virtual InterfaceU1* getInterface1()
    5 e& q7 w, \* l# N( P' h" t, F[size=1em]      {
    . Z# L& {. A1 i7 V" H9 s8 M; q[size=1em]          return this;
    ) R, Z, Z+ x6 P$ q" {8 U[size=1em]      }
    & Y1 J" j0 c+ z& D; r+ N% O* w; G- Y" P[size=1em]      virtual InterfaceU2* getInterface2()/ M  \* |& j% R  ~
    [size=1em]      {
    / `' p; o, B/ R
    ( n  d, C, V  Q[size=1em]          return this;" Q+ ^2 ]% u. \; X' L; h! Y
    [size=1em]     }* C, ^* b1 O) [1 |8 v1 Q9 v
    [size=1em]     virtual void func1()
    ) K, K6 w- r% M* C[size=1em]     {
    ) t  ~! l5 z" t# }[size=1em]         printf("%s", "func1");, M% G& N' p! o7 ]. N
    [size=1em]     }
    ' n* k2 q* u" R' W
    1 O: E: B# h( o/ f6 e: @* F[size=1em]     virtual void func2()
    9 s& Z$ i" l9 f. q! R[size=1em]     {
    ; a! v. j8 ?6 x: v1 v( y[size=1em]        printf("%s", "func2");
    # I+ E0 f% C# I4 d7 ?- a  N- [$ W[size=1em]     }6 D  t0 U- g8 b+ ?" N
    [size=1em] }
    ! ]3 [6 H- D- w& }, X& |
    / a- q. t: T; _2 }6 f* m

    - u2 l! p1 F' P( t! j% J

    1 v2 S$ _4 T4 o3 o! m- ~! o$ [$ G9 \
    假设有如下代码:
    1 @! s, W( [: n' u/ t; @[backcolor=white !important][size=1em]PHP code
    3 o" D5 D% l- ]' o
    [color=white !important][size=1em]?
    ! d1 K6 S+ \+ ^/ t, Z
    [size=1em]1
    6 M. ~) g& o" S
    [size=1em]2
    ' o1 m, c) }0 c- M2 `$ t! T
    [size=1em][size=1em]Base* pBase = new Base();
    ! v; m( R7 ^: k1 n1 x[size=1em]pBase->getInterface1()->func1();
    : j) Q) `( c7 n. h5 B" k( d6 }: A# t  n* U
    + d. @# {7 H, O

      n: ~! \5 J' c5 u( V& t1 J9 ~8 }8 S* P4 e! x
    其实以上代码等于:
    ! _; c1 W% I- K  o5 Z[backcolor=white !important][size=1em]PHP code
    4 h- D; G+ w/ B3 v6 t
    [color=white !important][size=1em]?

    : P( Y/ e6 R4 k1 J0 R% W+ S7 V9 k
    [size=1em]1
    2 o; g) e, J" p; p& I5 [
    [size=1em]2
    , S- U4 F$ _+ f3 s
    [size=1em]3
    2 k- U& A4 ^* g7 i5 c6 }/ u
    [size=1em][size=1em] Base* pBase = new Base();1 i' P" x( z5 H! D( U- \
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();+ g+ \- I& o1 `# g+ P! p
    [size=1em] pInterface1->func1();4 t' @9 [) V- s8 f7 x$ l. a
    0 q$ _+ S4 C' ^+ A$ A

      B: H8 f- R% Q0 n; M4 v' G3 J0 Y3 y8 e. x; D$ e) q

    # F* f7 ]5 p% \9 a4 u: W- L7 i% `1 Y

    - b, h/ V* _0 ?: D3 ?1 p  D/ n( V              C++编译后,Base类的虚函数表如下:  T: A; u( }; b+ c  u- y6 Y
    [backcolor=white !important][size=1em]         PHP code5 {, I* Y) h( j) }$ `' K8 D* F
    [color=white !important][size=1em]?

    3 \5 ]7 Q8 e. F0 f" R/ ~. W4 G, f
    [size=1em]1
    $ f+ u7 O- V! b; s/ C
    [size=1em]2

    - S7 Q! ~9 z7 x/ }1 h% h
    [size=1em]3

    ! s2 c  J: J. t) x8 ]
    [size=1em]4
    ( L2 c* \! s2 _  d; g
    [size=1em][size=1em]  
    " B& Z# e/ U, O[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    7 J( q" G/ L  r; z* S8 N- S- ][size=1em]  vTable:InterfaceU1 |Base::func1()|' }! ^" B; I. ~& n1 p& e3 w* Z0 K
    [size=1em]  vTable:InterfaceU2 |Base::func2()|& S% J6 \+ \2 i
    ; X) z7 h9 ?# \' B
    5 Y% f" u) l0 w1 |8 j
    : y, U1 b  N, n+ ~) N

    ) ~1 b% J8 M. o+ k  n4 Z
    " E" S4 ?2 r- o     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    - N* Y# a- X+ f4 n: ]' F    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    6 D. s/ d3 N  w0 Y    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    0 E4 u3 y) y$ q! x% T$ l7 y" R    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    6 Q, h9 [' F+ t/ T9 Y. k2 G% [2 o5 i8 C3 s
    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-7-13 15:43 , Processed in 0.591661 second(s), 49 queries .

    回顶部