QQ登录

只需要一步,快速开始

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

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

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

19

主题

9

听众

25

积分

升级  21.05%

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

    [LV.1]初来乍到

    自我介绍
    德玛西亚
    跳转到指定楼层
    1#
    发表于 2015-4-17 09:51 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    [backcolor=white !important][size=1em]
    [size=1em][size=1em]  class
    1 d! R8 y# z2 w& I- C[size=1em]      InterfaceU14 I/ W, I' K" N; q* J/ d. c. w' c
    [size=1em]  {7 w% a- S3 f- }5 N6 s: ^
    [size=1em]  public:$ J6 U  R4 S3 T! M
    [size=1em]      virtual void func1() = 0;
    ) R4 R) t1 g- N[size=1em]  }( \8 H* I) X% n- s
    " l1 Z; r) H  G- \/ P! M5 W
    [size=1em]  class
    & V  s$ o; C' c" c7 ?; o9 }[size=1em]      InterfaceU2
    7 F# l" n* m) M7 t2 v* h[size=1em]  {5 i) k/ Z1 B* i
    [size=1em]  public:( V! G8 ^0 k0 K! j2 P$ _, L- w
    [size=1em]      virtual void func2() = 0;
    ) g* P9 t; O2 A) F[size=1em]  }  s/ |! Y4 L+ s9 @7 \
    7 m% i6 X! E8 Q4 G* S
    [size=1em]  class& v" p9 K3 m& E8 O3 J
    [size=1em]    Wrapper
    # K8 m( e( _) x; y2 A! h; U9 v  z[size=1em]  {5 w5 D5 _& F+ _7 ]& P! c
    [size=1em]  public:
    + I  R2 _5 x2 _& J/ P. C, @[size=1em]      virtual InterfaceU1* getInterface1() = 0;" E2 w3 q0 Q. ^2 T
    [size=1em]      virtual InterfaceU2* getInterface2() = 0;
    ! G, }6 S, `+ b% c% O% t" t[size=1em]  }  l5 G' H# c- z  g( ]) ^' z
    + b! P( R3 W8 s/ F0 h6 j. p  w
    [size=1em]  class3 e& W% ]; j& }* p& t: b
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2
    , E* n8 R, f- W[size=1em]  {
    ; x3 W3 Y/ h3 _9 c8 G9 Z; [[size=1em]  public:2 y& B/ b2 }2 g' W
    [size=1em]      virtual InterfaceU1* getInterface1()/ H; w0 w, T+ }, r, `. p/ \- T& U
    [size=1em]      {* ^4 ^- N; N9 }% @% N
    [size=1em]          return this;* y1 |. c: }& v" ~- }& `0 K
    [size=1em]      }; C4 w6 I, [# j5 v
    [size=1em]      virtual InterfaceU2* getInterface2()" |( h/ m" n9 Z1 m5 W3 Q7 i, Z
    [size=1em]      {! R1 b4 ^  V$ n# a$ s( ]3 s6 o
    & r, }3 r4 N+ ~( U* @
    [size=1em]          return this;/ q- u+ L2 J. O4 |6 {4 Q6 a" W
    [size=1em]     }+ F/ E# E' {8 |
    [size=1em]     virtual void func1()" a$ L! ~; n7 g9 f, R
    [size=1em]     {# o7 f/ g! w0 D0 k4 i" Y' R2 _5 s
    [size=1em]         printf("%s", "func1");& U5 J& O  ]3 o9 b- z% z
    [size=1em]     }
    # F/ _: \; C( c$ J. K9 m  u$ P5 m/ c! Q) v& @% _9 i  ^/ ^$ ~
    [size=1em]     virtual void func2()" l, x  f7 y# {% W' S7 _* Y- g
    [size=1em]     {
    4 e* X0 Y- W1 l% R[size=1em]        printf("%s", "func2");0 M$ {9 Q9 X+ W, ~; M
    [size=1em]     }( K3 d+ p, h4 x4 n
    [size=1em] }  m* ^  Y7 @& a* q
    ! x" F+ l6 R0 ^4 f
    # o; l5 @. D6 z" J5 |! h, @

    / s, F7 m$ p: X
    9 \2 e( [& Z' g( }& e9 T假设有如下代码:& Z& _4 x/ E6 G" }4 b8 N7 z
    [backcolor=white !important][size=1em]PHP code
    # W7 Y* L) m( r0 \* y1 o* _
    [color=white !important][size=1em]?

    7 Z( `5 s+ M* M7 v+ M9 X
    [size=1em]1
    3 f" Z9 L0 p/ \7 Z
    [size=1em]2
    7 [! z' Z# Y6 }  {
    [size=1em][size=1em]Base* pBase = new Base();
    # `. I3 T6 T* Z[size=1em]pBase->getInterface1()->func1();' H9 v9 t8 `+ g+ W
    2 E. z; J; `) a: j' k- ^$ M
    * w. z& N+ g+ e* A- \; {
    0 F) e) a/ w. A
    , u! a% i3 W2 D# M% M) u9 |! {
    其实以上代码等于:
    ' A9 W8 z" J8 A* U7 C  _" S5 K[backcolor=white !important][size=1em]PHP code
    " d  J9 d  p; w, @+ p/ K0 V& B* b  m' M# }
    [color=white !important][size=1em]?
    * g; l8 S2 b. z, l4 v! Y
    [size=1em]1
    + V6 m: k  E/ c7 T7 `' `
    [size=1em]2

    * M8 h& n) l0 K. _
    [size=1em]3
    6 d/ J" n& L' d( _" n/ g
    [size=1em][size=1em] Base* pBase = new Base();1 h' o- ~: k1 U' h
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();1 s/ y3 @2 n8 @- V# y" X/ c+ P
    [size=1em] pInterface1->func1();9 U/ v" F' L; Y7 b
    : a; x# c, H1 M3 {9 R

    4 Z6 r2 ?) c2 F" F4 r
    8 e9 N* {' a1 |  x' D: y
    ( E0 }: `4 R" n# K( U9 k7 L3 s3 U( ^; Z$ i$ Z+ R# \

    / {5 Q% M, ~9 H. g4 _              C++编译后,Base类的虚函数表如下:
    0 Z- O0 i7 ^& n# |, m/ P( k' t5 V/ T[backcolor=white !important][size=1em]         PHP code4 I4 f/ _9 X9 t( a, E9 p
    [color=white !important][size=1em]?

    4 a6 n6 e% J! o/ C+ P. E5 S
    [size=1em]1

    & e3 y" b0 u2 p
    [size=1em]2
    ' H* Y, I( _3 X
    [size=1em]3

    6 V/ x5 c0 X& T7 }6 ~# B/ Y
    [size=1em]4

    % K6 O6 ~9 ?7 u+ @
    [size=1em][size=1em]  - D- R9 M0 P9 _  b0 f( V, V# z
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    , A  p9 v/ T! |  W- u. E[size=1em]  vTable:InterfaceU1 |Base::func1()|
    & M9 c( c% K+ y[size=1em]  vTable:InterfaceU2 |Base::func2()|$ W& q& s- e) p3 n% L9 S

    , w( Q- O. q2 l9 g& i6 ?1 V8 m

    2 s8 T5 }' G; w/ z0 H, O6 K# u1 Y# l+ i7 u7 D/ v

    2 j6 y9 J% z& ]7 m# ]0 e9 O& V2 d) q  x) B; f" W2 O. a
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    8 E% J5 Q0 H2 M. H; ^    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。: T( H4 ^5 w0 e3 e! n8 Y( a
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    % D$ K! m2 g8 g$ t3 e5 e    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)) H. w: E7 P* O3 V6 k. [9 M& P; p

    , Q7 J/ [0 v. e2 p7 k4 t1 x% j, M
    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 06:22 , Processed in 0.435140 second(s), 51 queries .

    回顶部