QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1688|回复: 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
    2 Q  C' Y  }9 m/ ?[size=1em]      InterfaceU1
    4 w4 `+ u; m: O8 v  j[size=1em]  {
    ; n% s  q9 l2 [. G8 q[size=1em]  public:
    : S6 i% }. L. w) U[size=1em]      virtual void func1() = 0;- V% g' O# e+ v- }0 X% k
    [size=1em]  }  M( F9 X. x7 ?3 @7 \" p

    1 M* X) s. C- R0 s$ b[size=1em]  class
    / X2 [, @" v) V[size=1em]      InterfaceU2
    : L+ F; A& _3 O" g2 }[size=1em]  {
    2 c5 c3 P: {/ t" W- {& ]0 J[size=1em]  public:/ k2 o* S: h' a8 o% E# H; C! g
    [size=1em]      virtual void func2() = 0;
    7 s5 }+ U' L7 e1 h; X[size=1em]  }
    : v1 g6 a: b8 X0 \1 E+ }& }) b" ^  [& [% f* ~. a( U8 D+ \
    [size=1em]  class
    9 H( h7 C+ p/ m[size=1em]    Wrapper
    % q& s7 a- H) G- h. w$ ~! _[size=1em]  {" P$ W# x' a3 p$ P4 C+ J, W: q* u6 W
    [size=1em]  public:1 Z' p2 x" S8 `: b+ W* b5 ]% V4 o
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;+ h" a. i5 J% V; m8 @7 W
    [size=1em]      virtual InterfaceU2* getInterface2() = 0;
    4 g' S) i* k6 u% Q) L& e[size=1em]  }: I* ~8 Y. {6 ~3 R% v
    1 a/ G  }* K7 r
    [size=1em]  class6 v9 g. i. v4 K
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2( x3 Y7 K' ~$ D8 B" f4 ?0 O* _
    [size=1em]  {) u8 Y6 N0 |; b+ ~: l3 A
    [size=1em]  public:
    4 j% ?# R% |# z$ t2 y[size=1em]      virtual InterfaceU1* getInterface1()
    0 j% o$ `- _/ n% h4 a1 x) Y[size=1em]      {
    2 @0 R- ?" F) C4 u( |. W+ S[size=1em]          return this;6 k+ A7 E" Q4 K
    [size=1em]      }
    0 ]. T8 N4 u* h8 L[size=1em]      virtual InterfaceU2* getInterface2()
    5 W4 |0 N0 \0 M+ d: t0 j[size=1em]      {
    # q! I) Y/ H6 L7 d- l& }
    2 A. L" D) m$ w" A# [[size=1em]          return this;1 l% A1 A. D& Y3 X7 V% A
    [size=1em]     }
    $ b/ e* C& ]& m+ y9 B[size=1em]     virtual void func1()& P: p. v- _/ E+ M7 K' F
    [size=1em]     {& A7 D. `# L. C
    [size=1em]         printf("%s", "func1");
    : s# n7 B4 i1 ~9 ][size=1em]     }, f5 N: n5 r( B( [. N
    ( U7 |( X9 Y2 z4 {7 r4 X4 `
    [size=1em]     virtual void func2()
    ! s6 F: X! L5 J5 f& B5 h+ ][size=1em]     {
    3 Q) y9 k. w7 }& m, i[size=1em]        printf("%s", "func2");
    9 d) {: N( f# e5 L8 ]9 B) ~[size=1em]     }
    ! j6 p( B5 ^( M& E9 v- u[size=1em] }
    / w& u9 X) U. C/ x9 g0 x
    1 k* N  e) D+ M& ~3 n1 y

    4 \5 Z' L" u$ s/ k! ^+ ^

      G: a9 O1 W* c0 c. @5 r8 q5 c8 b1 z, [) a5 e
    假设有如下代码:9 |; a3 n2 P+ d, b" }
    [backcolor=white !important][size=1em]PHP code
    & Z# z. h! l' Y1 G3 Q+ X6 ]6 p
    [color=white !important][size=1em]?
    4 Q5 p+ p9 o! g. O. m3 ^/ [
    [size=1em]1

    ) ^5 K$ k" g" b
    [size=1em]2

    2 [, h4 {) f2 d! x, b1 |4 X0 B8 S: D
    [size=1em][size=1em]Base* pBase = new Base();/ M' i2 n9 O/ J1 ~# \
    [size=1em]pBase->getInterface1()->func1();5 ~. J  r$ O; F3 |* N

    2 [3 Z, ~- P7 C2 o% D
    % h# u! E" g, ~% H# L! v- a
    - B5 ^8 J% x  i5 _2 h4 x4 k7 q
    0 C8 A) T$ T/ D# z8 H
    其实以上代码等于:
    ' e6 v) ?; Q* _" Z[backcolor=white !important][size=1em]PHP code
    ( O8 L/ Z/ s) P% \; ?
    [color=white !important][size=1em]?

    ' y& O# x( F% B' c5 D8 ~' M# ^
    [size=1em]1

    9 q4 ]0 O# X; _1 r
    [size=1em]2
    # i5 O) s# n: u; q& z- B
    [size=1em]3
    ( l0 ^2 C! u! F' |* c) H
    [size=1em][size=1em] Base* pBase = new Base();, B3 t1 t7 m6 q, L
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();# P/ P# b5 L& q) k) A  D
    [size=1em] pInterface1->func1();
    ! r: L' G; B4 P) g' f2 y+ M' q: K" b7 h0 ]6 X& r7 W

    + c2 r  o8 N* D$ S9 ?3 b! S0 P) N; I% k  Z$ w( a, _$ @  |
    " f* ?+ o' m: S* d8 P
    ; u! ]- y1 W% A( b+ ?
    : ^  O% J- v7 M* U. p7 U
                  C++编译后,Base类的虚函数表如下:/ P, F* z! r1 E; ]) e$ k% T; o4 g
    [backcolor=white !important][size=1em]         PHP code$ g) f% _3 ]% P, I' z* H9 V
    [color=white !important][size=1em]?

    - ~% `) K' s- t/ d
    [size=1em]1
    8 g4 A' l; J- y6 J+ f& l
    [size=1em]2
    ; S( t2 k& R; P8 D' f
    [size=1em]3
      F# K2 x6 m' d  R0 O
    [size=1em]4

    8 v+ V. I9 ], T2 h, r
    [size=1em][size=1em]  2 z# N& C' o/ i* O  R( E
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    2 }2 c+ |2 `! M7 n$ `[size=1em]  vTable:InterfaceU1 |Base::func1()|; q1 \7 _! e% d8 D; E5 I& O8 J% m
    [size=1em]  vTable:InterfaceU2 |Base::func2()|# o/ T7 a; P8 W
    4 h+ }6 Q' g# F$ p* Q) e
    1 Q6 j2 H* p9 V/ H( B  M5 P
    1 v9 F7 ]. B8 S9 t5 u
    ! `! }7 n" Q% ]% _
    * g# D9 `" E7 D& K& d0 \( D$ ~
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。; A- t) e8 c6 p, H8 d
        但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。* a1 E0 W6 [4 f; J1 E' H
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    $ l; r( @) ~) K3 x    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    / g2 L9 h/ ?% T6 A# Z/ i/ j3 h7 _# _3 v9 _
    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 18:23 , Processed in 0.304805 second(s), 50 queries .

    回顶部