QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1716|回复: 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- M% n1 O( u3 O% \
    [size=1em]      InterfaceU1& @  ~* t* V; ]7 p/ H+ b
    [size=1em]  {; x% W) K5 G/ l: q" B
    [size=1em]  public:# s+ y8 H- j% l
    [size=1em]      virtual void func1() = 0;
    / X! T: v/ V- H' S, k- I' t[size=1em]  }
    * H& ]- c1 X" b1 _  @1 \2 {5 H0 v5 D. p4 [
    [size=1em]  class
    * \  Z+ x2 {/ j5 [[size=1em]      InterfaceU2, R+ }  M; r8 B# X5 z) _; v
    [size=1em]  {
    2 c* A1 n- S+ @( Z% w4 G[size=1em]  public:
    " Q" T4 v( t% p$ d" I, s1 O: M# x[size=1em]      virtual void func2() = 0;
    - S0 \& I4 B$ V5 A- t0 l, w5 x  L[size=1em]  }0 y1 B& ]' h2 m  l* n

    : k- e7 Z2 m" Y" `[size=1em]  class
    , _5 m, j" S: w4 H[size=1em]    Wrapper
    ( P9 {8 L. \, e( C$ y' E. I[size=1em]  {! Z; s" p2 K9 B+ `; f5 P
    [size=1em]  public:. q4 D8 l( ?/ r& G; X+ `# G1 O# J
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;5 s' }0 ]& y% p4 B
    [size=1em]      virtual InterfaceU2* getInterface2() = 0;
    - x9 P0 @% _' Z* G6 w[size=1em]  }/ X5 F/ M% A9 _6 V. u% o0 m8 p
    . Y4 O, @, H4 I. e" ?
    [size=1em]  class- B; A! M1 {0 A9 w9 L# k0 |2 L
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2' s1 K: q2 u+ k+ k5 e, X1 Z6 Y
    [size=1em]  {
      y6 ^" o( q; \" B1 y8 [[size=1em]  public:) W* t2 U" ^: W8 Y* [( [- g
    [size=1em]      virtual InterfaceU1* getInterface1()
    1 R) @4 E& G" h/ M: R[size=1em]      {
    9 H' L( ]! Z+ \6 M! t% P6 A! }[size=1em]          return this;8 z) I4 {) b- b
    [size=1em]      }& o$ o- f! ~# U
    [size=1em]      virtual InterfaceU2* getInterface2()+ M5 [! _' \! K. r) d
    [size=1em]      {
    , E7 p$ @. I% p/ `  _: ~/ K% N5 \5 z9 J6 ]+ {
    [size=1em]          return this;& \! L2 r/ X" T. Q2 @- n3 P
    [size=1em]     }1 X+ R" K/ x2 ?4 O, \9 u
    [size=1em]     virtual void func1()' ^8 h/ E( `/ s( T
    [size=1em]     {
    3 P0 R1 A! e) x! T" n[size=1em]         printf("%s", "func1");  M" t# ?% K0 h- Z4 w6 [! G( G
    [size=1em]     }
    " ^8 A3 W$ f! i+ \
    ) b- X4 J7 w  {$ O5 h[size=1em]     virtual void func2()7 d( `4 q* e; W
    [size=1em]     {
    7 }0 t+ p& y: [* K& I* o$ B[size=1em]        printf("%s", "func2");& i; L0 e: p! u
    [size=1em]     }5 n5 z; c- S3 O/ D1 s: e* r
    [size=1em] }
    . S+ [! w9 a+ z9 T  S4 Y$ d4 `+ F. K8 z
    1 P* c9 j  Z' I$ {+ V

    . h6 s& p+ _/ c& v/ k7 s& x* k
    & n* L7 a# T3 p9 s) y* E1 ?# K$ q假设有如下代码:5 o+ T8 b* F9 [' \
    [backcolor=white !important][size=1em]PHP code
    " ^% g7 y; x, ~: Q, t& q
    [color=white !important][size=1em]?

    3 F6 d- a- H! |$ z: C5 C" S* R
    [size=1em]1

    . J1 ^# ?) w1 {5 f" \3 W
    [size=1em]2
    : V! s3 ]  E, c! l& b
    [size=1em][size=1em]Base* pBase = new Base();* v+ {& v3 E8 w2 |& i3 H+ z% Y  B
    [size=1em]pBase->getInterface1()->func1();
    , Z8 R6 }! M& l; j( {2 O) l" u+ K/ x8 T9 M/ e
    $ {- ^, R/ E6 i! i# z

    * y9 z% c( u2 X+ T( R
    6 ~8 B9 u/ q! P) f- h其实以上代码等于:
    8 y: m1 g! c. T" ], H5 u# C, x/ I[backcolor=white !important][size=1em]PHP code# ^7 a! z9 w3 F/ _1 g
    [color=white !important][size=1em]?

    ' y) S+ }. K- x8 m6 k
    [size=1em]1
    $ K* n4 K: v0 U4 c7 p
    [size=1em]2
    $ U& y1 ]* r- ^% s" o
    [size=1em]3
    ( {% }; o5 `' p4 D4 d& s
    [size=1em][size=1em] Base* pBase = new Base();
    + X7 Y0 ^0 k( }[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();9 m2 S& l: i! E: L/ M
    [size=1em] pInterface1->func1();1 `8 z' d0 {. p0 m% d( f1 k' W, S
    ' Y" ~4 U& R; j6 j5 t
    # V; I" w, _8 l

    8 _3 \+ N, J1 Q. ]$ X
    / }* d( b: k8 K; Q, I
    + s' s1 o2 m2 V0 V0 q" e
    8 z4 r4 s+ F: B: n              C++编译后,Base类的虚函数表如下:
    # k) c8 g! n8 L) u; Y, Y[backcolor=white !important][size=1em]         PHP code
    ! J: t' Y" c' N0 k' G4 D
    [color=white !important][size=1em]?

    # j* ^2 p5 [  l1 F7 [( j4 y
    [size=1em]1
    7 n" t# [/ n. _/ J, I
    [size=1em]2

    1 c* J& g& {3 Q$ l3 ^
    [size=1em]3

    , a& e: r0 |( T
    [size=1em]4
    * u5 n# X. C8 r0 |
    [size=1em][size=1em]  7 N2 E: H! ?8 A7 P" s
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    ; [, z4 B2 u& P9 ^: n% M3 o! v[size=1em]  vTable:InterfaceU1 |Base::func1()|1 A; x5 K3 k, W: n' S
    [size=1em]  vTable:InterfaceU2 |Base::func2()|
    3 ?6 y/ `; s! k4 P- f3 y' ?, u' q0 g. V( l3 H; Q; Y
    # n" e  C) t# L4 q
    4 @5 m1 x1 O9 k( `
    . L6 J* H5 E/ i6 u
    3 T/ d7 @" U1 `2 z, j
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。0 K( V4 u. H; a1 z& Y1 [; Q
        但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。) V# m3 m4 ~) j6 N: U  F
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
      b: w; W, P% B" X* G/ j    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    6 i2 M/ C2 x7 E5 C: ]& A; c- K
    % j( Q, R( H; r3 U, J
    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-9-1 16:08 , Processed in 0.320563 second(s), 54 queries .

    回顶部