QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2069|回复: 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
    $ C6 S; |' }$ Q- Q[size=1em]    InterfaceU1+ C0 j8 x4 {" [9 _7 J- Z+ |
    [size=1em]{
    2 W. y8 f  l( `[size=1em]public:; C; I! \8 v  {5 Q" F5 D
    [size=1em]    virtual void func1() = 0;4 o- }" l8 g( T9 B
    [size=1em]}
    " n0 {+ u/ e/ S# w
    1 g7 N" c: L! V* L[size=1em]class
    ( [# K! \. c4 j# Z# b[size=1em]    InterfaceU2
    0 |3 z  Q. d2 I% f7 B; X5 w[size=1em]{+ K- q, l4 T" \! R) A  y
    [size=1em]public:
    5 w6 R  J: f3 n* F! w[size=1em]    virtual void func2() = 0;) N. u- E# X' i% E7 p' L
    [size=1em]}% w6 C3 q0 H- d) C3 |, g$ S

    ! t- f1 I2 `; V' X) t; p( j[size=1em]class
    $ }' X* U; d, q7 @5 H[size=1em]    Wrapper
    8 t3 w0 [6 l: b$ [% v6 G: [+ I[size=1em]{
    7 M; J" n% u$ J. R5 I' F0 l" l[size=1em]public:& X. s0 c1 O+ F  m* E" H/ `5 f
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;
    - ]9 h) i9 T$ X' R5 K" `- y[size=1em]    virtual InterfaceU2* getInterface2() = 0;* ?4 ~: G0 r' h4 m* w: }- k
    [size=1em]}+ J1 r% J4 Y: h' [

    & V! I$ A. q; b. h1 e1 O, g. U[size=1em]class3 T* z: E9 D4 k6 B* M
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU25 H0 U# U2 A- q) ~) V& q3 d
    [size=1em]{
    6 E  m- k9 S7 _# q3 \/ Q[size=1em]public:, `: [, i- a8 n3 M$ L, {3 r. Q
    [size=1em]    virtual InterfaceU1* getInterface1(). l) J5 H: r4 A4 [% d2 N& ]- C6 S" W
    [size=1em]    {
    9 J: F# X# l' N4 k) U* |3 _[size=1em]        return this;2 h% s, K8 ~7 b/ @; g: S
    [size=1em]    }8 P0 ^4 d, J8 N/ P1 K
    [size=1em]    virtual InterfaceU2* getInterface2(): B2 @* }8 h" O: U" z2 b
    [size=1em]    {0 p. b, w% Y$ K1 L& `
    ( C6 A; p' G3 b7 i; ?5 f3 A$ J6 r
    [size=1em]        return this;
    2 G# K9 k+ e/ ]7 A+ x[size=1em]    }
    3 W( z3 b! F  o' B7 T6 q[size=1em]    virtual void func1()0 o3 \2 `) z: A( d1 X
    [size=1em]    {+ ]+ C% C. g/ c3 r% i3 ]( v8 |1 t  R
    [size=1em]        printf("%s", "func1");
    * u" N  \& w  E  h% p% T4 V" Z! u[size=1em]    }
    % r, [2 [' N& P1 c  H3 Q" ^9 D+ a: W, f; S' o/ A3 N
    [size=1em]    virtual void func2()
    9 O& A& M0 r/ k# o: q2 N, a, w[size=1em]    {
    + m9 s" g: a' _# z1 I* h% k  ][size=1em]        printf("%s", "func2");, C# S! T7 [9 C: j
    [size=1em]    }% J7 h- J6 p9 u5 V
    [size=1em]}
    , _: l  E, w+ L  V! i
    5 v1 c( V' q0 G- Z) \# z
    / f3 ]/ Y0 F1 V+ L" W) k

    ' H  v& X: K6 q' ^! N
    & @" E- C' _9 S) Y2 `. z" H假设有如下代码:1 u0 }5 \, A2 Z
    [backcolor=white !important][size=1em]PHP code4 K! Q( c3 i, g, e' V+ Q
    [color=white !important][size=1em]?

    6 Z, e0 x% s7 s+ Y
    [size=1em]1
    ) g) Z1 l+ o# B
    [size=1em]2
    - D  G4 r1 I- M! s
    [size=1em][size=1em]Base* pBase = new Base();
    , x! V) ~! C/ n4 }) d" C[size=1em]pBase->getInterface1()->func1();1 |: \3 J3 J. r, b& u

    ' n9 u6 ?2 D8 }6 G8 ~8 W# R

    9 l/ X6 c# c/ n; x- K+ d; g
    ' m- C  b  L: r( f- _0 i! K
      D: U- B* L! a# A$ _其实以上代码等于:* m  R; Q/ t# A! }' F
    [backcolor=white !important][size=1em]PHP code9 v. t6 U2 H- f
    [color=white !important][size=1em]?
    $ O" Q) I9 h7 h" f
    [size=1em]1

    & k. P& D5 {$ K4 v1 g! O9 H
    [size=1em]2
    + r3 \( W* d( P
    [size=1em]3
    8 p  c+ E9 r# o' E* P2 s% P
    [size=1em][size=1em]Base* pBase = new Base();$ _. V7 C- K  ^1 N8 L! _
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();% b2 t" Y/ G' y* ]& e
    [size=1em]pInterface1->func1();7 m# @) X; u' \* u8 S1 e) h  G/ ?
    9 N1 c4 A2 Z1 G7 w* Q7 a
    , {. A- U+ y  c! b9 V! o% D

    + a" D' M+ t# z& f; x7 h4 j/ i2 P8 a, k6 N6 g8 k* c+ ~

    . W$ E5 [2 S* o0 j/ V
    " ]' ^' a  Y2 ]3 B( L& J" ^C++编译后,Base类的虚函数表如下:4 X* P/ [6 j7 S* w
    [backcolor=white !important][size=1em]PHP code& {0 o! Y0 ?* o# m5 f
    [color=white !important][size=1em]?
    , N; t3 m; f: e' I$ p
    [size=1em]1

    ( ~  T" p- |3 H7 |
    [size=1em]2

    1 K% Z1 O6 W: K8 ^7 E- j3 C. ?) D
    [size=1em]3
    # k" a* \- B& D& p' \7 G: W% T" K& w
    [size=1em]4
    ) V9 {9 w. N% n9 e& N
    [size=1em][size=1em]  0 @  [9 @/ F1 |; w7 ~* n! e# K
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    7 l, S$ K$ F; J9 O4 @9 N[size=1em]vTable:InterfaceU1 |Base::func1()|* v- B* A" B! \6 v$ a
    [size=1em]vTable:InterfaceU2 |Base::func2()|6 k7 J( g8 g  Y* ~
    ) s" }+ g) M; q4 u* i/ Z
    8 e  @1 f1 N# O$ U
    8 ~4 }& l* v/ M2 N+ Q, J0 X, y* f
    : _: \- ]7 O' i6 E: [4 L
    $ [' f- o9 l9 _! X5 w: g
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    * v- {2 m3 f# e9 ~/ K+ N但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。% z$ P% h+ B8 x$ g9 e
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    2 v0 I4 I7 t/ X' cC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    ! y7 U) R+ O, C6 a8 S, h
    ) u2 |7 d+ z# X) h& g; b
    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-5 08:08 , Processed in 0.547261 second(s), 53 queries .

    回顶部