QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2078|回复: 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
    $ D$ J0 G5 D$ \; }. z, h7 b/ Y[size=1em]    InterfaceU1# t! L1 G3 H' L; ^" p; o
    [size=1em]{; [+ X5 R& V0 V7 h4 k. E8 q" `# V3 v
    [size=1em]public:, U3 D% \. }- m% {2 p
    [size=1em]    virtual void func1() = 0;
    2 {; ^. i5 |+ [6 i: N- N' h* W[size=1em]}2 G9 b9 k" _! y9 K5 x3 b
    : C; C9 ^2 m; @+ t, Z
    [size=1em]class: v$ ^# i. L, G0 i' K' ~+ v& H6 Y0 |. r
    [size=1em]    InterfaceU28 W4 {- R% H( h- U2 R' g$ @
    [size=1em]{2 X( o( u' P) [& r
    [size=1em]public:$ s" _( a% s+ x
    [size=1em]    virtual void func2() = 0;/ L! x0 ]( L" u6 n
    [size=1em]}3 J! {! y/ p  V9 T7 f! l
    ; z- e) r. b; d1 J' J
    [size=1em]class( Q( B  n  O7 U6 h
    [size=1em]    Wrapper
    9 o0 O3 @  B* I: y6 }3 X/ `[size=1em]{
    - b& Q* U9 _! i: q* O[size=1em]public:
    + k0 X' t# B5 n" I) Y& h[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    & L6 ^; [4 f. e5 a9 ~( |[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    $ A& |8 e& H! h' m[size=1em]}  D3 o& T* `( [5 s1 Y& f

    4 W' z0 _; z; h9 i/ S+ |[size=1em]class+ s; ^/ n- l  L' ?) f  K) [; }
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    1 C5 n% u. I3 [+ D1 z' L! u6 Z! Q, y3 @[size=1em]{
    3 l! [# M* ]" E' b6 V9 C[size=1em]public:
    : ~0 f, w! [+ r5 F# `/ G[size=1em]    virtual InterfaceU1* getInterface1()
    # D2 t. {! s- ~: Q! ^. s[size=1em]    {
    - F2 R2 x$ n/ f2 N0 }% C[size=1em]        return this;
    5 U2 ~2 c# c' \9 V1 v[size=1em]    }
    2 @/ J7 v+ V' X. u6 i: {6 ^) Q[size=1em]    virtual InterfaceU2* getInterface2()
    $ A/ {  V7 T: w( G* w[size=1em]    {& \8 H& H$ @; C/ L, g" f) p, W& L
    & g" f. z) @& M  U& d7 ~
    [size=1em]        return this;
    : r% i$ O0 W1 v) J& r- v# l/ x& r[size=1em]    }
    # X! T2 w1 ^& b* \& k[size=1em]    virtual void func1()
    ! w  p# d- b7 b1 t2 ], d% E[size=1em]    {5 }# a& G' P( i* b6 M9 d* l
    [size=1em]        printf("%s", "func1");
    2 `+ e$ c! q: N2 E[size=1em]    }' U: z4 v5 v* s- U0 R# g+ u

    $ P5 x3 }' f6 x# s: s# |& `[size=1em]    virtual void func2()+ Z8 C( r" x! h/ o) V
    [size=1em]    {
    1 H1 b5 g$ c, }" Z- s, c6 s[size=1em]        printf("%s", "func2");& X  j9 Y2 L3 H$ q9 V% D5 [0 y# Y* h
    [size=1em]    }2 ]5 j1 F6 F8 ?( v2 D2 f& o
    [size=1em]}& [) c  [0 J% H
    7 O; ]: A+ k  e1 y" |  A4 m9 t

    " U( N# B" z2 ?
      T7 {" B& S9 w8 |7 \/ k# {

    " \- C+ S4 W7 {0 S6 M" s* A假设有如下代码:/ l, Q( }' |2 ~) ]
    [backcolor=white !important][size=1em]PHP code
    9 p! r/ y. `2 a9 Y  m5 r: E2 l7 B+ @
    [color=white !important][size=1em]?

    ! @+ k* P. x0 B2 _& h% Z' j8 j% s
    [size=1em]1

    9 Z. T# c9 f8 f+ z+ N1 H
    [size=1em]2

    8 ~8 a& P! z& X; ?. k: k( S" H
    [size=1em][size=1em]Base* pBase = new Base();
    1 A6 K# g  Y4 `* [[size=1em]pBase->getInterface1()->func1();+ V' M0 A5 J# r( r. W

    , z( B8 V/ v! E
    ' W+ p5 M7 B$ p5 ?
    , P) k( L& Z2 G3 {
    * }2 b6 R0 I7 Z# k" o
    其实以上代码等于:
    - G2 o* H9 Y  y3 X3 }[backcolor=white !important][size=1em]PHP code
    / Q7 G" A% D* V6 Z
    [color=white !important][size=1em]?
    % b; J- ?+ m6 X4 I) Z# I. W
    [size=1em]1

    7 `; Y: r. \4 n- ]( k
    [size=1em]2

    * i: u4 G4 W; G8 N0 \
    [size=1em]3

    - p8 B" U, p4 `& W
    [size=1em][size=1em]Base* pBase = new Base();
    3 ~' W# g8 g% n[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();# R0 t- F0 |3 _; s* ?
    [size=1em]pInterface1->func1();7 Z. o. i7 \( V1 a$ ]% q
    , u9 [2 l4 V6 `, v& P
    8 @/ J/ G3 _/ t( I) R
    2 o+ A& k: l; P# z8 E
    ) B# j/ p3 E. }" j2 I' g* v

    % h2 \% f1 j3 x$ C' Z1 y- T
    - ~4 d, u, u: g" X, F" G0 [C++编译后,Base类的虚函数表如下:
    ( ]. X" I4 V8 _: f: ?[backcolor=white !important][size=1em]PHP code6 \( d! M) H) ~# S! g2 B  I
    [color=white !important][size=1em]?

    - d9 e6 d3 b/ B3 g: g' h/ G! ^* F
    [size=1em]1

    0 a5 L- N/ M$ U' Z' s& ]! g
    [size=1em]2

    ! u* d9 C% c6 V* E, B0 H1 |% s
    [size=1em]3
    ; v! i" l* I2 p$ p, f; i
    [size=1em]4

    - k# M/ l1 ]5 k4 Z- P
    [size=1em][size=1em]  
    ( g, Q& a) E' Z1 n  k& @( k% U[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    4 v6 o+ z: m7 @[size=1em]vTable:InterfaceU1 |Base::func1()|
    " S5 f9 v0 B1 t0 `5 r. l: Z' M5 ?: P[size=1em]vTable:InterfaceU2 |Base::func2()|" j5 W4 Y1 f& n& f/ n
    . ^6 d* W: \2 Y. ?. h( p

    # m, c4 K" T+ y, L  A. j' M$ K" N3 |6 c: m6 E2 o$ r

      Y/ M3 s8 B1 p9 i# S: H& G) n% t) X  S, r; A. ^
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    8 o) ?# a( M+ z但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。. a( F) I0 N! L% g1 F
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?. Q5 f1 X% N+ V
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    % N: L% a. x3 Z+ _7 o( h& I7 E. Q/ E- x7 F4 P7 c
    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-8-31 19:28 , Processed in 0.671114 second(s), 54 queries .

    回顶部