QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2116|回复: 0
打印 上一主题 下一主题

C++ 中多继承情况下 如何确定某个类型的方法,在虚函数表中的位置?

[复制链接]
字体大小: 正常 放大
蕾欧娜        

19

主题

9

听众

25

积分

升级  21.05%

  • TA的每日心情
    郁闷
    2015-4-14 11:21
  • 签到天数: 1 天

    [LV.1]初来乍到

    自我介绍
    德玛西亚
    跳转到指定楼层
    1#
    发表于 2015-4-17 09:47 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    [backcolor=white !important][size=1em]
    [size=1em][size=1em]class
    ! ~) L1 [: Z' ~( _[size=1em]    InterfaceU1& H1 y' A: C8 z( @: h8 g
    [size=1em]{- @1 y# x# N  Q2 E2 ~
    [size=1em]public:
    5 {2 ~+ r! A2 ^" a5 C. s' H2 n[size=1em]    virtual void func1() = 0;% O& [% o3 g+ i  J$ s4 Y6 v! X; L) t% q
    [size=1em]}
    ( W# E% O; _9 D  u6 ]3 G( B
    + Y. T) r) w# X; h) `[size=1em]class7 J2 @6 K7 A  A
    [size=1em]    InterfaceU2# q$ @" s2 Y8 O/ K5 {' N
    [size=1em]{5 i3 f6 x+ `' B8 g% c+ @
    [size=1em]public:
    6 t( @/ I9 Q! r0 D7 J. f/ K[size=1em]    virtual void func2() = 0;
    & B3 k. @; F1 _; S' H2 R2 S1 w[size=1em]}
    # _! i! v+ I1 H" h8 m! B* v3 G9 g1 L5 V) J
    [size=1em]class# i. h7 d/ ^* c; `9 H: Q3 {" G2 v! Y( P
    [size=1em]    Wrapper
    % d0 F( L( d7 `  F+ V& |8 m  C[size=1em]{2 b7 c6 ^5 q& ^5 D0 \9 l9 j) C
    [size=1em]public:
    ; F5 y6 K. `; P: M! ~5 J' N0 D[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    / E" s5 U  x: |9 \; c[size=1em]    virtual InterfaceU2* getInterface2() = 0;  f' j0 R6 M( j4 F5 X
    [size=1em]}
    4 [! S+ o+ D% s/ T7 z) l5 \" r( W+ J
    [size=1em]class4 P+ M& ~) _4 n
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2  h6 n. B( R5 N7 K1 f2 i7 |
    [size=1em]{
    ; i  h  C9 \" H4 m, v! }( e[size=1em]public:
    ! s0 `. U; S& V9 R6 \[size=1em]    virtual InterfaceU1* getInterface1()' P" X" @( }4 W. S* Z  A
    [size=1em]    {
    . U: L3 l2 M4 I! J$ f. m1 Y[size=1em]        return this;: ^+ W$ Z8 b3 X% Z* p$ n* ~- t3 r: ?
    [size=1em]    }2 {4 B: I! y: G# R- j$ m
    [size=1em]    virtual InterfaceU2* getInterface2()& e/ E) ?" B- X5 I
    [size=1em]    {
    ( N$ X+ h0 w- f, c
    + T3 F" ^2 u/ I3 R[size=1em]        return this;! T2 v$ ?3 b/ \7 \" e
    [size=1em]    }
    . O& v  A+ f' Q[size=1em]    virtual void func1()6 J: G0 f& A$ O2 O# |& s- W, y
    [size=1em]    {" A$ v# T4 l$ p9 C4 J! W" {/ E
    [size=1em]        printf("%s", "func1");
    - a- X( s9 `& C) g; I! V9 T[size=1em]    }
      D" @1 e. Q- l
      k1 ~; \% K: |* `[size=1em]    virtual void func2()
    / ~0 O- F* v1 g. j+ ^[size=1em]    {7 b" ?4 ~6 s7 g+ ~9 y, a( a
    [size=1em]        printf("%s", "func2");' p! y% A4 N0 G8 C5 P, D; L& F; i
    [size=1em]    }& \6 }0 l( q1 q5 r
    [size=1em]}
    $ Z2 ^) u: ~) [& O' J1 ]
    ) s" K/ g. W& x. E6 S
    - }/ Y( [) P  t! a/ I$ i
    ) T( u) G, G- j. c/ ?, l+ J2 K7 _5 t
    - }; H6 [( Z* E3 v) \/ t: v
    假设有如下代码:1 V" M+ ]7 X8 m4 o, _4 L0 k* g9 x
    [backcolor=white !important][size=1em]PHP code
    " m6 s7 q. b# M- @7 n2 L  k; @/ o6 J7 n
    [color=white !important][size=1em]?

    2 w! E2 u, Z) H8 ^% D& H2 H
    [size=1em]1

    + e7 P5 p. I, d$ ^
    [size=1em]2

    ( D, a$ v: M2 c# \$ T4 ^
    [size=1em][size=1em]Base* pBase = new Base();
    ! ]% ]1 Q, }; h8 Z[size=1em]pBase->getInterface1()->func1();
    ) k" b& t4 s" ~1 v
    : s$ d2 |# K; J/ j
    5 n" }" i7 e) t! u" ~* t* z. d

    % Z  X, E9 S2 L; P0 E. L
      w5 S& b& U" j$ z, _其实以上代码等于:
    / _. u! R4 b$ {; n+ s[backcolor=white !important][size=1em]PHP code5 \3 l, P! J3 L# d: s
    [color=white !important][size=1em]?

    4 d5 ?; H& c3 c. ^
    [size=1em]1
    5 v$ g" A0 k( ^3 G! R
    [size=1em]2
    . @* t8 ]2 n7 q  G& ~' u
    [size=1em]3
    9 \. E8 m# z1 ]; W8 I# V' i- m7 ?  b
    [size=1em][size=1em]Base* pBase = new Base();& g: F; p- u+ E" W
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    6 M$ z+ o  n7 }[size=1em]pInterface1->func1();
    2 T- R9 m# F# I: F& W! b, W" S2 W1 l/ _0 L& |4 m9 l) C
    # [4 `  X$ @$ z
    - B) @0 w/ v- c: ^/ f: l: D
    % X( x3 \; S/ o& b1 M% `! M

    4 P0 A: C# r7 r# ^. e
      }* ~* ~4 J" I- M5 SC++编译后,Base类的虚函数表如下:
    9 r1 m# @  ?! h9 O% B; b[backcolor=white !important][size=1em]PHP code$ C! `6 g0 B/ ~" L
    [color=white !important][size=1em]?
    ( _/ J" [' @+ e: y  s
    [size=1em]1

    * k& m( R: s# g) F
    [size=1em]2
    5 `( Q3 \/ W* t) r
    [size=1em]3
    * C; z8 z0 \: k7 q+ o6 H
    [size=1em]4

    ' L9 W& }. i1 p, `  R
    [size=1em][size=1em]  
    # r  b4 P" e5 o6 R[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|7 A" }# B; n- a. y
    [size=1em]vTable:InterfaceU1 |Base::func1()|
    % c5 x9 j" ^3 @' Q[size=1em]vTable:InterfaceU2 |Base::func2()|
    ( B! l+ u4 x- {, I* h2 m- U( G1 V8 j/ [
      o1 r  X! A( H0 ~) b" N

    5 K. N2 o% V' \" K! Z" G, L) D1 c
    2 q, c& r/ g4 T" t8 f* A* ?, K, b5 _
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    ; [: S6 X  |- V/ m5 R. I9 e但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。) E6 n4 }# t0 \# l, {3 b1 C
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?) N8 q1 g3 S! a3 {, T+ e; R1 F
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    + s0 T) W" G% ~. ^+ y, b: w5 K4 [! M: u+ _% m3 T
    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-9-24 17:04 , Processed in 0.406671 second(s), 54 queries .

    回顶部