QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1741|回复: 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]class4 P/ ]  U7 K4 S' V- Z' ~
    [size=1em]    InterfaceU14 k1 n' I) ^3 x0 Z  u) q
    [size=1em]{6 V2 r* }' ]. e- K3 x4 h  j& _) C
    [size=1em]public:
    / T) n. X( H& z1 @& z- I6 ?[size=1em]    virtual void func1() = 0;
    ) s1 a8 s1 e  `& c( A  y; \, y[size=1em]}
    / r# L3 H6 [2 n: e, Y
    " V8 \8 H- J3 U[size=1em]class
    3 n- N( V0 ^! }" B/ o+ v9 M7 `2 D[size=1em]    InterfaceU2
    / X2 Z0 ^' @+ b: @7 J/ `. {[size=1em]{
    ) }" I( b+ |5 @  p6 r: j[size=1em]public:
    2 }, W# W! K- `. H; D' k[size=1em]    virtual void func2() = 0;
    0 i" c5 p" u1 M[size=1em]}& k. X$ Z/ s$ `/ l
    , b6 x5 }% k* f$ N4 a9 @0 @
    [size=1em]class
    * h- ~& y8 M" ~% M  _' }) [  T/ a[size=1em]    Wrapper$ ]* z& Z7 R/ g6 D
    [size=1em]{
    # V: _/ ]$ T% r2 ?0 B. @[size=1em]public:
    7 |, X1 }8 F# H2 |# r! n[size=1em]    virtual InterfaceU1* getInterface1() = 0;4 D, ^( p6 \6 ~; K& V0 G
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;! o, c# _* X, `5 S. F1 B
    [size=1em]}
    ! B0 u( l( `: ^% p, n: c, K& F, y) |$ ^) z' A
    [size=1em]class" {8 t" R  Z  k1 o6 m5 c+ M
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2% W, K! l4 i6 B2 R
    [size=1em]{
    " V  }- [$ J- @( S[size=1em]public:  i) N4 a8 x' S! }4 i
    [size=1em]    virtual InterfaceU1* getInterface1()
    , Z% G6 \; T2 V) q[size=1em]    {* T; b- W$ I) P
    [size=1em]        return this;" E/ S, e* u7 d, K
    [size=1em]    }
    0 B$ A- u3 J3 M& j8 B  q- M' E[size=1em]    virtual InterfaceU2* getInterface2()1 g0 J6 h; w: b# X
    [size=1em]    {
    . d! R3 F- X+ i, C, P" \# \
    , h- g+ ]7 U7 g( x' v( X[size=1em]        return this;9 T* R/ h; Q; R7 y: f
    [size=1em]    }+ b7 H8 |# M! [3 b9 o& t5 \
    [size=1em]    virtual void func1()9 }% `" K! I+ Y# @
    [size=1em]    {. j4 n( Q4 d) C+ c9 S, _
    [size=1em]        printf("%s", "func1");* N: X3 G4 }8 j* W/ ^
    [size=1em]    }
    # b7 {  Y  {3 V& y
    4 \0 K; [) M) T! j& S7 k[size=1em]    virtual void func2()$ c0 {( W$ {& P& G) B( d- Q. q! C( O+ J
    [size=1em]    {% n, }2 w" q0 f/ ?
    [size=1em]        printf("%s", "func2");
    * J, T' T6 a" d5 ]# Y" I7 w) m[size=1em]    }
    6 W8 q% c5 p! o- m/ n0 V% z, X/ X[size=1em]}9 ~% O* l, z# m

    . U- p& L8 x( s* X% u+ B9 k/ r

    - ^! Y/ r/ W  O$ m: t0 N- I) U

    ) D( P, b4 {+ f7 u* C" }2 Z% W0 Z
    / @- H0 i, R# I  o$ b8 b假设有如下代码:4 ?8 X9 ?+ K( t/ J6 l
    [backcolor=white !important][size=1em]PHP code( [5 G5 P6 G2 ~/ k. f
    [color=white !important][size=1em]?

    5 l! Q& v2 P4 H/ E+ z
    [size=1em]1

    2 p1 o8 r+ v( {3 K7 o
    [size=1em]2
    * W* r4 T; c9 u7 v( V" X
    [size=1em][size=1em]Base* pBase = new Base();
    ! y+ U/ T7 X0 H# P# z8 K- u[size=1em]pBase->getInterface1()->func1();2 X3 a1 H) _/ i/ A6 k4 f3 c: S

    2 D4 ~" s- W  z+ k3 j* X! \/ o/ _

    3 U0 k  l4 X$ t* F" F( A- ^
    " h/ [3 I6 `9 X' u' G7 e
    ! n% o* m* L, j. m. g6 J2 E其实以上代码等于:; N+ f( J  ~. K7 c- ?% x* l
    [backcolor=white !important][size=1em]PHP code1 }$ q' S) ]# z( v2 B. Q
    [color=white !important][size=1em]?
    1 P  {" C5 ?7 W& H7 v8 u0 H4 _
    [size=1em]1

    & l) L- q+ @# S6 m2 ^
    [size=1em]2

    5 W0 d6 M1 n" C4 Q  X+ q
    [size=1em]3
    8 h' _# Q) |  y
    [size=1em][size=1em]Base* pBase = new Base();  I6 v2 B% N* V) e4 w  ~
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();: V# q/ g& C6 r/ T: V' K
    [size=1em]pInterface1->func1();% c8 B+ _& N5 Z) l
    ( `/ h, R6 I& A

    5 M+ E4 \, I  I1 M3 i( ^# c( `- }- Z9 O
    7 M# q) W" U7 C: t" J! s% j) R
    7 n, ^8 V8 ?1 D) v
    9 A5 f- M. [% ~" P  [
    C++编译后,Base类的虚函数表如下:
    8 R( u. ?8 |- e0 \! ?[backcolor=white !important][size=1em]PHP code
    $ @  ^% O) L% _  a, d
    [color=white !important][size=1em]?
    + d  \! ]) V- h2 F, o
    [size=1em]1

    7 T1 @% l- q( w3 E4 b, O
    [size=1em]2
    8 R$ }) a, T4 @5 H( c: ~8 b# M0 q
    [size=1em]3
    1 c$ E# w- O' Z% @9 G2 \
    [size=1em]4
    " z. o3 U% O8 f  ~
    [size=1em][size=1em]  
    / \) e) l. [* k; \! ]: O[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|; k$ X7 |) b3 i! U# x+ y( W
    [size=1em]vTable:InterfaceU1 |Base::func1()|0 i1 ~2 O+ J# V! a/ f6 I, Q* Z
    [size=1em]vTable:InterfaceU2 |Base::func2()|; G  W, o3 @  C6 e& r  ~

    6 x  L, H, {8 t' Y# h; |' b5 f  X
    ' Y; F& ^+ p' ?- `$ z) e* c/ c
    5 ~0 F9 M: h* v1 @

    7 ~1 W3 Q; \( {* s& K: O  B
    9 W! ?& r2 m2 r2 [# \0 U9 v2 z如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    & y- [- z& Y0 Q8 F( Z, }( O$ k但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    # O0 j5 h3 v5 q: E+ o. FC++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    ; b% @. z2 [2 A9 qC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    * n3 Z+ z( F3 @4 ?% M! G3 P
    0 W0 {, v# H# h, z1 ]( l
    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, 2025-8-19 07:19 , Processed in 0.385343 second(s), 51 queries .

    回顶部