QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1658|回复: 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
    5 u" \: l" @3 W5 l% D8 f; ^[size=1em]      InterfaceU12 z$ V1 c* N; x, I% q7 f
    [size=1em]  {
    9 z; u8 c- k- w3 O( X  @$ `* T$ _1 X[size=1em]  public:: A* R4 u  [! ?/ V& F
    [size=1em]      virtual void func1() = 0;2 G* b; [, ~+ Z  j/ I
    [size=1em]  }
    ) R, S: \( j/ f
    - C7 o: L" B6 N9 _) m" i[size=1em]  class
    + A, p3 m6 r! N[size=1em]      InterfaceU2
    + |# e, g1 Y6 o/ S& y& F$ U( N[size=1em]  {
    - i! Q( F) b# Z* _+ ]; A[size=1em]  public:3 g3 O/ |& ~: O
    [size=1em]      virtual void func2() = 0;$ K9 A) a# M: j% M3 [$ ~
    [size=1em]  }
    - \& d9 n. `+ O7 }+ p: i. t$ a- n& P( P6 y  |7 F
    [size=1em]  class
    9 l2 @5 T* V" ~! ~[size=1em]    Wrapper
    ' S' u5 D5 i3 i[size=1em]  {, v' {7 N9 q! m3 k
    [size=1em]  public:
    " m5 M- E* w1 J; Z* R[size=1em]      virtual InterfaceU1* getInterface1() = 0;
    / m- t- e9 d. Z* W- f[size=1em]      virtual InterfaceU2* getInterface2() = 0;
    0 s3 V' m3 {/ f# M/ f[size=1em]  }% Q; Q" A; ^& Y3 H) m! g6 b

    . a1 d2 s0 z) g6 N; Y[size=1em]  class
    ; F: t. _, }1 f[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2" m4 Y5 ~" ?  V0 _, D9 [
    [size=1em]  {
    , ~" w  r  j, Q( w[size=1em]  public:
    & n9 L& K. s: f[size=1em]      virtual InterfaceU1* getInterface1()7 c' N9 x5 W% t3 z
    [size=1em]      {
    + \, |1 e& [8 y5 b% H! x; {[size=1em]          return this;$ l4 k, ^: n( a
    [size=1em]      }. `6 T1 D& W" s
    [size=1em]      virtual InterfaceU2* getInterface2()
    : W% D) o; `7 D/ @) O[size=1em]      {
    - _% Y2 b" J1 n& C) V2 W0 e) b0 E6 z. ?0 k$ `# j* X
    [size=1em]          return this;5 z4 z1 g; s5 L# n  C
    [size=1em]     }
    7 b8 @9 e2 b7 j9 X  b[size=1em]     virtual void func1()
    9 F" H& ]( A& d+ M5 G/ j* {[size=1em]     {
    ! P3 E" P1 o) e# Q' c[size=1em]         printf("%s", "func1");
    3 v; x3 s" T. h( e; ?5 E& m) T[size=1em]     }
      y9 Q4 V3 J; D9 ?  F7 Y
    % Z* `1 n5 e! V6 q& S[size=1em]     virtual void func2()
    0 `# h; G2 U3 h! O* l[size=1em]     {& h5 m+ G% I( j8 C6 Y
    [size=1em]        printf("%s", "func2");& a/ P3 F. \- X% {% h/ c
    [size=1em]     }( e2 I5 A3 O, b3 A. v
    [size=1em] }3 V1 y( M7 v7 |" L& ?( ?
    ; |& L6 H4 J5 q! \) E* U* l" F- M1 Q

    1 Z: ^/ {6 q! U3 ^* Q" V0 A( l
    : Y& d, w8 y6 |+ Y3 g  S

    ! d3 ~0 n& j) M/ ]6 i- L假设有如下代码:
    5 M  F9 _8 y5 [; U[backcolor=white !important][size=1em]PHP code* P' T3 f& D# v* P2 c# x
    [color=white !important][size=1em]?

    2 e3 G1 p, Q) R7 G/ B$ E9 Y2 b
    [size=1em]1

    ! M, T  I. u- Z; p/ a  ]
    [size=1em]2

    * {' s  C. c1 K0 w7 E4 m3 Y& S% l
    [size=1em][size=1em]Base* pBase = new Base();
    ' E2 Z. W% ~0 X7 t% p  F1 S8 X/ U[size=1em]pBase->getInterface1()->func1();! \% c: I# |4 k& R
    8 N- y4 P; t* o8 C  M  c

    ( y; J( ?( @  X$ o, g6 _* k  ^: j% O
    , b# z2 y+ I( T( k2 i0 }
    其实以上代码等于:! X" }4 o. i8 T
    [backcolor=white !important][size=1em]PHP code2 L! b6 V( ]8 X! Q6 ]
    [color=white !important][size=1em]?
    ; a! C) k& g' i
    [size=1em]1

    % C7 Q& {' R- E/ a
    [size=1em]2

    # @  i# W) K0 R+ H
    [size=1em]3
    - g" t: F/ P2 V6 q, \$ T
    [size=1em][size=1em] Base* pBase = new Base();  a5 U. M* }* E* |' A9 r1 U
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();! X# \3 T& q- m( h: x! w( A
    [size=1em] pInterface1->func1();5 c- U( ]3 @5 l: ~! f) M, r  l
    : ~3 p$ K& ]% a4 x0 a% T9 d4 a# a
    . {  o/ P: y; ?: r3 f7 ?4 y' v0 [
    6 C0 w* |' }+ i& _
    ! O9 R% V; {$ d! f
    : L" Y- \0 g. I4 d2 B8 \! O! V

    4 P* S' ?' h- X: \+ E) l6 [              C++编译后,Base类的虚函数表如下:
    ; D8 Z# {0 F7 W  E* J' P[backcolor=white !important][size=1em]         PHP code" A( V' @2 G' ?+ s6 l4 C( i# _
    [color=white !important][size=1em]?

    ) Z" M, W8 ~2 r8 U2 [3 A$ A, S
    [size=1em]1
    ; F* h. g' S6 g. |
    [size=1em]2
    0 R! E  r( N! b( m- Z3 N+ c' G
    [size=1em]3
    - ~5 X4 p. k  Y, v
    [size=1em]4

    " ?' g, O5 L0 i9 M, x/ b0 |
    [size=1em][size=1em]  7 [7 Q, U0 [0 s' X) p4 L% Z. l
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    - D8 E  T4 P  X0 l8 y6 N: p[size=1em]  vTable:InterfaceU1 |Base::func1()|/ k) x9 l5 c" Y6 q7 b
    [size=1em]  vTable:InterfaceU2 |Base::func2()|- X9 c6 f, u6 x  W6 l8 d) W3 }' H
    / s4 P! ?2 {; W6 T1 n

    9 Z! A* r' ^+ \; |6 j
    ! K8 P2 {8 x9 r( K7 o$ p% D2 H* E# h$ E% ~. m5 G$ q
    1 U4 u# Z( s7 K& v! A4 s
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。( [7 O+ S( Y( K8 N7 {' l( ?
        但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    + B1 I$ [8 o& d9 `+ l) @' \3 v    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?. p, N# i5 p" }% ^+ U, \, N: E
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    ! |7 ^4 E! q* T2 h! i, U
    " `; [5 e' B$ u" H( a) H& e
    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-5-26 23:47 , Processed in 0.417921 second(s), 49 queries .

    回顶部