QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2006|回复: 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# r' Z1 l6 t% i" |8 [. k( z- q2 |
    [size=1em]    InterfaceU1/ Y  X3 U7 W  Z1 Y
    [size=1em]{
    $ g, O3 k  D; ^: V+ R! `[size=1em]public:
    + O/ T) _. p1 z! }[size=1em]    virtual void func1() = 0;
    " Z+ r. H* g$ m" z1 w[size=1em]}
    5 ~/ b4 \* Z9 F2 T0 s+ W. x' P& W. e. D- W% `
    [size=1em]class
    9 K$ K2 o7 j1 h. o[size=1em]    InterfaceU2$ {9 r+ k4 A; C/ t
    [size=1em]{
    $ [3 h0 P2 X4 R& X: C) |4 I[size=1em]public:" c& m, |) @3 c7 A# r2 {) P4 t
    [size=1em]    virtual void func2() = 0;+ I8 X5 v/ u7 n6 R8 `
    [size=1em]}! p7 z5 s0 r7 s, Z. v! Z0 ?
    9 ]! I3 ], [1 h, y
    [size=1em]class: a5 n5 m4 l. k, m, m- i# F
    [size=1em]    Wrapper
    - e6 o# V, `/ {* }8 O7 l; E+ G[size=1em]{( {+ D. A& f6 |; d( [- ?
    [size=1em]public:
    7 B- g. B1 s- z( w( C! H) `[size=1em]    virtual InterfaceU1* getInterface1() = 0;2 K& O7 b' n5 m+ y
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;
    2 X  S2 ^% ~  j[size=1em]}
    : y6 Y: L( W$ X/ Y4 q( S& @6 }5 p/ |# E* }) T+ G7 E
    [size=1em]class
      p, z0 ^' d% D) l% F2 c[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    7 p' s+ T4 q# z# `[size=1em]{
    ' r* z3 R1 D0 T- ]0 Y4 K+ V6 b[size=1em]public:, a. I" r4 h3 n
    [size=1em]    virtual InterfaceU1* getInterface1()& k( b8 R- J+ J* x
    [size=1em]    {
      m  N# j# H3 P- C% i2 N  T' B[size=1em]        return this;
    - G3 Y# B% ~( g[size=1em]    }& a2 O4 R% C, Q4 |
    [size=1em]    virtual InterfaceU2* getInterface2()
    , K+ O$ t1 C+ C/ w( U7 g[size=1em]    {
    4 k+ l5 ^! c% r/ j
    ( ~2 `9 Y% R- A" C% `* }% z[size=1em]        return this;
    + [6 ?/ J0 f8 m7 e[size=1em]    }# p% O' |" y" D. B+ q1 L
    [size=1em]    virtual void func1()
    6 ^. E7 F1 n! `/ Y5 W[size=1em]    {# [- ^( x0 ~1 G* n
    [size=1em]        printf("%s", "func1");( z+ ^* m7 z2 z& ~9 J1 ~6 z  L
    [size=1em]    }
    : A& n+ C$ {& O" [5 f
    - N0 U+ E* R( N) q# s, Y8 t[size=1em]    virtual void func2()
    3 M2 \  p* Y. B( C[size=1em]    {
    5 \+ S$ ?% @: D7 x6 [8 Y; q" a& @[size=1em]        printf("%s", "func2");5 O4 F4 d9 b# N! H
    [size=1em]    }
    ) v$ U# y! A3 A- p' u, i[size=1em]}
      ?$ q& f9 Z  n- Y; o- K4 j* [( Y, T" H9 h1 S3 L0 D1 {9 V

    * k7 ]3 s. s' X% V& v$ p% W+ \
    4 L7 p) H7 v, C4 O

    9 q; P  j2 I$ N0 V. }3 G假设有如下代码:
      c0 r% _, F$ v: \( P[backcolor=white !important][size=1em]PHP code$ L. K' D) N8 m
    [color=white !important][size=1em]?

    ) h, F, o( Z9 q# V0 R
    [size=1em]1

    # W! ^8 O' k6 }& K
    [size=1em]2
    ' P7 J6 F- f1 S
    [size=1em][size=1em]Base* pBase = new Base();) J( I$ y1 X" P
    [size=1em]pBase->getInterface1()->func1();
    * B5 `  j9 h1 }5 V' D) Z. ?% C
    ( c! t& Z- n( E  d5 E$ [3 \3 J8 ?
    " a3 U+ \) c6 l& ?, k

    / z+ X+ U2 c3 z5 R+ X4 x
    * S3 P' v; V2 h. T, a3 N0 r& Z其实以上代码等于:- I4 n9 i( p5 I0 @8 @
    [backcolor=white !important][size=1em]PHP code
    8 B8 w6 U5 I. G+ }  _
    [color=white !important][size=1em]?

      S8 u* c- o( P
    [size=1em]1

    5 U, S; Q& g3 P5 m' V
    [size=1em]2
    . J. h: _' N- x2 ]' p1 c7 l/ Q
    [size=1em]3
    * F2 I; E  @  `. [
    [size=1em][size=1em]Base* pBase = new Base();
    - x" g' j* W! b" M[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();6 y9 I0 t) w2 G0 r3 G1 l& i! H
    [size=1em]pInterface1->func1();
    1 ^. K) r: M% B4 @9 s) b- |) @5 I2 b

    0 P, Z- R) E: O% Q6 t5 O* Q, J# `, r% n4 b* u8 b

    % f6 }( e6 d' U1 s) G$ w0 X/ q8 A5 Y4 p

    2 C" j; M7 H/ G9 h  dC++编译后,Base类的虚函数表如下:
    ; j3 s: t- G( {  M[backcolor=white !important][size=1em]PHP code
    * l  l" |8 ]' [' T
    [color=white !important][size=1em]?
    % L; S) ]$ X0 R# }& m0 n( a6 }
    [size=1em]1
    ' W/ c9 J+ I$ A. M1 W3 u
    [size=1em]2
    ! ?3 n* W3 v- \# I9 p* s/ b
    [size=1em]3

    0 o7 ^/ a$ t2 A  ~) \5 Q+ b1 Z
    [size=1em]4

    & r9 e$ H5 x8 _! L' C* k
    [size=1em][size=1em]  7 i. E8 J( z% k9 q/ r" [& ~
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|& [- H4 u6 ^& G. @+ E
    [size=1em]vTable:InterfaceU1 |Base::func1()|+ ^7 f4 [# e. a
    [size=1em]vTable:InterfaceU2 |Base::func2()|' @8 `5 T: U! k$ h
    9 u" j0 q9 E* a* ^+ w, p7 m

    ' \% S& m' }# Z; v8 ^4 O# @* _& K# B7 h
    % H; u  ?$ J5 E6 z
    4 W1 X% f3 S2 \- }$ V8 ]+ A" ^! ]  |6 M2 S. [" [) D% i0 p
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    - ~# ^! E- {" ~4 J) j8 o但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    0 n+ T' m( J5 [' [) j" W& p" uC++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    + H7 Z: e/ s: l7 e8 A4 dC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    4 u" {' n" D9 A- p" @- p& y' R+ x; U/ F4 H2 K
    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-11 03:05 , Processed in 0.492986 second(s), 54 queries .

    回顶部