QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1630|回复: 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]  class5 W: {7 q0 D, V' M, w2 O
    [size=1em]      InterfaceU1
    ) z; b- ^# H7 ?( i[size=1em]  {
      W4 v/ K1 F* [* w5 }: Y[size=1em]  public:
    & D! V6 d( e& _3 p% S[size=1em]      virtual void func1() = 0;
    6 j1 [5 n! x0 l' m) X# m" c+ w[size=1em]  }
    - u/ N- s( L$ }& l" q9 N1 \, S/ N1 G" \9 N) O! ]
    [size=1em]  class3 r% F& J0 N# u/ f# [3 ^! |
    [size=1em]      InterfaceU2
    + M1 N" i  O0 t& Q/ z[size=1em]  {
    8 j4 R" M# g. s/ |' j  z( m[size=1em]  public:
    1 `- ~+ Z1 V' Y: C* _[size=1em]      virtual void func2() = 0;
    ( r' g( j# C2 k. d6 T0 v6 s' l7 C6 \[size=1em]  }4 B% j/ `, ?: C* x" R
    4 F( W6 q8 b6 O) Q0 J5 l% V( G. s
    [size=1em]  class
    2 W, l3 j6 m$ p- B* ?; }7 @[size=1em]    Wrapper
    ; S& I  L$ M6 b, U0 y! m. l! X' _[size=1em]  {
    9 o7 j2 V" y4 A  N7 v+ y4 v+ n1 R4 O[size=1em]  public:
    4 g2 k% [. K6 g. W+ N4 Q; G[size=1em]      virtual InterfaceU1* getInterface1() = 0;
    : a6 E2 k9 I! v5 h. F[size=1em]      virtual InterfaceU2* getInterface2() = 0;
    + [8 v: {& ]7 e* T6 S0 v( h[size=1em]  }
    : }8 L/ v3 j7 c( F/ l& p- [9 j( Y0 q/ d6 Z1 a$ D  o
    [size=1em]  class9 U. `( ^" \: x
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2
    3 Q2 c1 `. H; F[size=1em]  {, E& A" G# V! g5 ]; m
    [size=1em]  public:
    2 @" P4 Q/ d. x* Q8 C; b[size=1em]      virtual InterfaceU1* getInterface1()/ z# O8 V# c6 X0 G% a# k+ ?
    [size=1em]      {
    3 b8 w3 D( R) J. e. \( [9 X" _[size=1em]          return this;+ {$ ~. D! [" J+ P
    [size=1em]      }: }6 \- o2 @& N; w. a
    [size=1em]      virtual InterfaceU2* getInterface2()' G3 H( s4 U: T" @
    [size=1em]      {
    ) E, n) _+ p9 b; U: j6 U7 g+ q
    & a5 B. v9 U) T9 Q. C8 r# a[size=1em]          return this;6 Y% c' f4 b) R
    [size=1em]     }" @. V# {3 o% g2 w7 X$ B3 Z
    [size=1em]     virtual void func1()) S* T( q- L8 L2 o& G6 T0 L% q
    [size=1em]     {
    0 _& ^. ?# E9 I# O( S; Q. W( _[size=1em]         printf("%s", "func1");
    $ U# ~) ?* M5 j' \6 e& \% D6 \; i7 b' {[size=1em]     }
    7 ]: H- V' t5 w1 h! d7 C* \
    : \; M' e$ \* b  ~0 ~9 H3 e* b4 L[size=1em]     virtual void func2()$ A0 X0 u& M+ r! B; }9 y
    [size=1em]     {/ q- G* c$ t& |# T4 f# y
    [size=1em]        printf("%s", "func2");
    6 k3 }0 j4 w. P& }[size=1em]     }
    ( L6 I- Y! u9 q4 J+ b, S. `[size=1em] }
    - ^7 D- }0 d* j0 ]  S+ E) x, m
    7 m' \# c2 D* _8 d2 T3 V" c
    * K% n2 r  u1 n0 C  J, D

    - f3 V4 J" M7 s( K
    ) z& @3 W) B7 C/ L假设有如下代码:
    0 x" l" ~0 o8 f( I[backcolor=white !important][size=1em]PHP code
    # e1 r% P6 A& a7 c4 Z$ y1 d2 H4 b! z
    [color=white !important][size=1em]?

    . s; u6 Y8 k( p# U5 B$ r
    [size=1em]1
    ; x$ B- z( {+ f" T/ [
    [size=1em]2

    ' ~. e8 ]& h# O, M$ |% ~
    [size=1em][size=1em]Base* pBase = new Base();1 O5 z! `/ ^2 b
    [size=1em]pBase->getInterface1()->func1();9 M0 e/ K% y7 Y% b  z8 Z

    & J% _7 P# K3 p# Z
    1 }) E5 s# F6 F
    8 M2 ~9 X* T5 A- x8 B

    ! S# J& m9 l% X9 C5 g7 t0 y' t其实以上代码等于:& k0 L6 w+ L0 z2 Y
    [backcolor=white !important][size=1em]PHP code
    + j0 e5 m" t7 S6 |( x
    [color=white !important][size=1em]?
    ) W7 L4 w% d9 s* P( @
    [size=1em]1

      H% G- S" Q7 @2 r0 O
    [size=1em]2

    ' b% A& t- D/ k% k
    [size=1em]3

    * ?! T# @% f# Q
    [size=1em][size=1em] Base* pBase = new Base();
    $ s' ]; n% |7 u- M3 [[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();  _0 \* I4 K+ q& x* s7 @- D% n" ^
    [size=1em] pInterface1->func1();
    7 z' Z+ A# J  |/ R0 h( E$ o8 |) f+ E9 j% L  u$ [3 q, v" U

    & N" O% e, H6 v6 A# x6 _+ F: i' t& O/ s& |$ q5 B2 N" [2 F2 M: t
    7 a6 b3 X. m1 a

    - S4 Q6 L* Q2 o$ v, d9 L/ k
    , p3 a& c! }! l/ z              C++编译后,Base类的虚函数表如下:
    " a, a+ A- v2 v  ?1 b1 H% ~, q6 o, m, A[backcolor=white !important][size=1em]         PHP code
    , P) L! _3 [2 }9 G  [4 x
    [color=white !important][size=1em]?
    . K- v; }2 v% x: W
    [size=1em]1

    ( a3 ?3 j# R/ I- U! L
    [size=1em]2

    " r& g2 F7 A' K5 C$ b
    [size=1em]3

    + @5 p8 y! b  x, E; S
    [size=1em]4
    : `3 L/ ^8 c6 `* a' K
    [size=1em][size=1em]  
    2 ?6 b8 {1 j1 O) T6 V) b[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    1 [- ~. D6 z4 h7 Q& W[size=1em]  vTable:InterfaceU1 |Base::func1()|
    5 H+ o' E/ g2 U. H  O[size=1em]  vTable:InterfaceU2 |Base::func2()|, s+ t& F* x$ T; ]9 E8 `6 O! {1 V

      T! c2 L: B' p6 y6 \
    ) X( t* Q& e4 P

    2 E) ?1 G. m% j4 O- ?# \9 i2 ^
    " ^# I1 B; K7 y8 L, E9 b) e+ B& J3 }2 z3 m- U  P5 w% [6 K8 R" \
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。* S/ w- E8 ^. x& M# Q4 @+ q
        但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    , _4 S) s* Q5 I, T  b    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?5 o  [# |  q. J- R
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)5 H$ G) t, {. j2 a
    $ J0 f- |* ]) @5 g* g3 L4 z
    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-13 05:47 , Processed in 0.292334 second(s), 50 queries .

    回顶部