QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1586|回复: 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' F' N/ M" {/ k1 Z) ?
    [size=1em]      InterfaceU19 @2 `) x  o; [- z5 V, n
    [size=1em]  {
    . a: s! q3 r% f& P" `* c[size=1em]  public:7 r: u; t8 U7 h1 H# Z6 j
    [size=1em]      virtual void func1() = 0;1 f, P3 M' d$ C
    [size=1em]  }! k' t' L7 X3 z9 S' l" b" U! `
    ) g5 B( D& a! c0 x2 j; h9 S7 N2 k
    [size=1em]  class
    ( P& G3 |# c) U1 C; X! t- E[size=1em]      InterfaceU25 T9 c6 S% y5 X" ?, }4 M' i) G( k
    [size=1em]  {
    3 q4 w& q3 _8 u[size=1em]  public:
    8 F* ?# \7 ~3 |* Z" [' f  b[size=1em]      virtual void func2() = 0;
    ( V9 o1 @5 E9 S8 E! \, w[size=1em]  }
    : e$ s9 f/ \4 c) |$ o  l+ G8 K
    6 j) U& ]% L1 [9 F7 f4 X9 D% m7 _[size=1em]  class$ w+ t$ A' H$ O/ A6 T
    [size=1em]    Wrapper+ T3 w, T0 ~7 Z8 c( t) ~/ n& i/ w) f
    [size=1em]  {) g: H! c& b' c
    [size=1em]  public:4 b' C! W! Y. p: Y4 y. A
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;
    * I- m; K$ t+ E7 Z  a( T[size=1em]      virtual InterfaceU2* getInterface2() = 0;1 a3 p7 E$ a3 s- ?3 N2 x% B
    [size=1em]  }0 H$ j1 M+ V, x2 W; @8 `

    * k/ }3 b% E! z- ]2 |[size=1em]  class
    ( b' x5 Q# o$ W7 Q+ ~! |3 [8 \[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2, [* W. v1 ^) J! @, @
    [size=1em]  {, j0 `+ C% \, \+ r4 C5 ^
    [size=1em]  public:
    0 f% ~! }7 u' G3 R[size=1em]      virtual InterfaceU1* getInterface1()
    6 \; K' S8 j1 h6 L7 z[size=1em]      {  A5 g3 \! x: A; _
    [size=1em]          return this;
    3 t! k0 R- ^+ T  c[size=1em]      }
    % L7 s4 P2 d7 H( i2 U# P[size=1em]      virtual InterfaceU2* getInterface2(). ?& f  {( I- w- V
    [size=1em]      {+ O4 z+ p  c( E& v, r

    % }) \2 J; f) l5 F9 V0 w[size=1em]          return this;
    & k, o3 ~; ^$ y9 f2 x/ p0 N[size=1em]     }3 O0 ?% t* ]! O! y" z
    [size=1em]     virtual void func1()& _0 g3 {% K7 F$ a5 H! K
    [size=1em]     {
    * p) U, ^( Z( Z* n; O[size=1em]         printf("%s", "func1");
    8 R8 t- g- v  K[size=1em]     }
    * b2 t: _+ E0 s% A# X: ?4 y
    5 S- O% K( l/ D7 `! Y" x7 y: T5 N[size=1em]     virtual void func2()7 Y/ U# R5 P( ?$ w3 V
    [size=1em]     {; {( }" f6 \# K' f
    [size=1em]        printf("%s", "func2");
    ' v* R( Y( Z1 A7 b2 X1 v% J[size=1em]     }$ o: y8 k& j" ~2 p+ T5 ]1 U& G1 b
    [size=1em] }+ x/ q3 E# Z2 I: E1 |6 P- q6 ^5 Y* Z* S

    9 _, N# d% l. _4 p( Y2 N

    ( ]$ `# s# j8 u( k0 }4 r

    + ^+ f) W! A5 M2 G) l( {  m% t  d4 Y% o0 w$ U2 a" n
    假设有如下代码:4 v% h0 X( ^$ V/ @/ p
    [backcolor=white !important][size=1em]PHP code* i5 \$ m. M0 x2 J' \
    [color=white !important][size=1em]?

    # j0 P: V7 x, g" s4 t! B9 L2 P7 r
    [size=1em]1
    ' c% O7 g4 g0 g# W) h
    [size=1em]2

    * v5 _, ^9 n2 H4 ?6 ?
    [size=1em][size=1em]Base* pBase = new Base();3 X( @, L0 a% V* J, d! H  `2 N
    [size=1em]pBase->getInterface1()->func1();, o+ s7 n+ x  Y; ~! z

    9 j# F8 Q5 R, e& E

    : {9 m: c% s. [+ w, Y4 i: x3 V: r9 g3 |3 k# {+ l- E5 X
    0 \$ q' O. N* e$ }4 m3 }5 k
    其实以上代码等于:
    ' J9 k( T: M1 ?5 N! S[backcolor=white !important][size=1em]PHP code6 o; h* @" Y7 H+ F
    [color=white !important][size=1em]?

    # C: Q/ o9 K, _1 g% v" R( H! E2 L! P
    [size=1em]1

    4 W$ f! K3 T5 M! o# b
    [size=1em]2

      P9 F: X4 W3 Q3 e+ L5 k" m  J' @2 ~1 [' N
    [size=1em]3
    4 X% {$ h& B" c, h( `
    [size=1em][size=1em] Base* pBase = new Base();
      `& F2 i; u, w2 n$ W/ u- A[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    $ V7 w3 A( V3 }- \[size=1em] pInterface1->func1();
    . |% g! ]( _: P! h
    4 i5 h  f2 Y1 T" B; u1 |
    1 e+ F5 y6 U( B1 I  A3 ^- U/ x) O
    ' Z9 G7 R0 c: T1 n
    : d0 G( A2 {' j5 ^7 h7 |
    . B" ~) i: b3 D( R* h
    - Z) R2 ^8 P9 T& \$ E" ^* x; O9 B
                  C++编译后,Base类的虚函数表如下:
    $ G+ D) e0 V8 i! M$ ^[backcolor=white !important][size=1em]         PHP code8 W6 l+ k0 O: T2 w
    [color=white !important][size=1em]?
    . {+ L+ S& I8 R# T# k( V
    [size=1em]1
    7 M4 |1 u2 o3 k0 n  o& {% h
    [size=1em]2

    7 Z4 Y4 R3 z  S8 V1 |/ b5 s$ T
    [size=1em]3

    , ]; G7 a: b5 [
    [size=1em]4

    7 g" Z$ N( |% r' N4 Z3 @
    [size=1em][size=1em]  
      y( I8 L; v0 Y. d# c[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|& W, V8 w' a* o( h
    [size=1em]  vTable:InterfaceU1 |Base::func1()|
    " ^# q+ @8 B# H3 o! C/ p3 Z; f( J[size=1em]  vTable:InterfaceU2 |Base::func2()|' f% B* ]. L7 i* A$ T# x( `, R

    ; N- n* U0 @8 K1 T! d* E& n9 O
    2 f% ^6 w( G- A+ j
    ' l% M0 j3 F/ Q9 D" _/ C

    4 \9 x& d9 F1 L& w% S' o
    ) |2 ~+ X8 ?2 Z# d     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    & h1 F' y3 X) P3 T& g    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    & P0 L6 X  @) P    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    $ q, B) Z$ ]* S( l" Z    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定). g6 n4 F: S; I' N3 `4 Q
    $ G+ O* g( o" V! Y) i
    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, 2025-12-21 01:19 , Processed in 0.700457 second(s), 49 queries .

    回顶部