QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1743|回复: 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
    + S' o0 B/ q& c' [[size=1em]      InterfaceU1
    ' }3 I8 u4 A+ ?$ U- E( a# M[size=1em]  {
      ?9 T' l0 M1 Y* {' l" S1 }[size=1em]  public:) V# P! z3 M# S  q0 _9 r# z
    [size=1em]      virtual void func1() = 0;; G( \1 ?* M' y6 v2 X
    [size=1em]  }! Z% [4 [1 X; u/ v2 `6 N
    3 t- r' f# M2 g7 }$ l9 ?1 }! S
    [size=1em]  class+ `1 j8 y9 V5 K0 |
    [size=1em]      InterfaceU2. r, [9 I. H9 l- ~; G/ I' X
    [size=1em]  {: c% k* ~! Z4 {$ C
    [size=1em]  public:' U+ X+ w5 J9 I3 c; T
    [size=1em]      virtual void func2() = 0;
    * @! S: p$ p" a1 f3 p/ R1 b[size=1em]  }9 L9 q4 A, h5 d3 I
    8 Z9 r* @) F# q& l3 b4 m& o+ \5 m/ ~" F% B
    [size=1em]  class: k- Q" P, F2 Q2 ^2 G# O. d
    [size=1em]    Wrapper+ h( G" [5 @3 S+ P0 y+ c; X! j8 l2 W
    [size=1em]  {' T) J. M& S& i
    [size=1em]  public:
    : ?% M5 `# ?9 @3 e" O7 @* o[size=1em]      virtual InterfaceU1* getInterface1() = 0;
      Z4 q0 c6 \" @9 d[size=1em]      virtual InterfaceU2* getInterface2() = 0;
    * l+ T1 t) D) F3 B# v; V1 c5 j( C[size=1em]  }6 g5 o7 K& E# c$ ?
    6 T2 [$ w. m" m6 y. }% l& e+ L
    [size=1em]  class
    ' d- v" c" i; i& d2 `# k' n[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2
    * T8 a/ L: v1 ]! _7 q[size=1em]  {* C& B+ g( {5 }7 e: w9 \
    [size=1em]  public:
    " x& u( `0 p- Y9 ?5 D& e[size=1em]      virtual InterfaceU1* getInterface1()
    ( L0 `7 T( K: [. N2 w- R) j' R" L[size=1em]      {
      h. a3 R6 W  v[size=1em]          return this;
    ' Z. ^4 c3 o0 l+ v, ]" j[size=1em]      }: D" _: c' s6 N3 c
    [size=1em]      virtual InterfaceU2* getInterface2()
    ) S% I9 E! K/ m: l[size=1em]      {
    - ~  H. K7 X; C' x0 }' ?0 \9 v
    : q: y; G, F, \* m+ z, o* ]7 h[size=1em]          return this;
    # q. Q3 F: S8 E$ i" r& w' g6 x[size=1em]     }, g2 b" k; x9 g. C+ `
    [size=1em]     virtual void func1()3 x7 I% c/ J5 A8 t
    [size=1em]     {& S* e2 u3 B0 C8 {& D! m, J
    [size=1em]         printf("%s", "func1");$ @3 s6 x0 F" a) `1 R
    [size=1em]     }+ u& B# D5 I% j2 Y2 _: d. Q
    4 N- }! _6 N" l( C- Z$ r
    [size=1em]     virtual void func2()
    4 O1 S& |$ Q6 o" u# B; `+ F& j[size=1em]     {
    7 w! G5 T4 W* l. W; ]( t/ v[size=1em]        printf("%s", "func2");. s5 Z% d0 Z8 R( I
    [size=1em]     }
    ; T8 ~, r& R+ F% d[size=1em] }- g: |# \7 ]5 }1 f' i
    3 O6 M( Q. P0 t/ |; d1 f8 q' K0 g

    ! j( E9 b' k) p

    3 N  h/ z/ {  {. |# o9 N( h" Y5 [4 |( C/ O; T! J! h
    假设有如下代码:
    6 J- x+ t! ^/ t[backcolor=white !important][size=1em]PHP code
    $ T5 d3 U  s3 K, t! r
    [color=white !important][size=1em]?
      G+ {* Z' a0 F8 ?4 |- J
    [size=1em]1

    % u% x) @- {8 _; I- Y
    [size=1em]2

    + }0 v" I% y" o9 d: g+ k
    [size=1em][size=1em]Base* pBase = new Base();
    # r) i3 }* R, z[size=1em]pBase->getInterface1()->func1();# ^& j; J9 y. g% Z

    0 ^- _# ^" a0 w. B' o
    - a. a3 k7 S: x3 o
    % j5 E8 w+ @, ~/ v9 r

    ; H' y- E8 l+ N6 W# D其实以上代码等于:6 f8 y( E& A( a4 }& K
    [backcolor=white !important][size=1em]PHP code; E% S& ]2 ~: z' E. @4 D0 B* `
    [color=white !important][size=1em]?
    * B0 W& Y6 @7 ]' C& i' j, f4 L9 x0 b
    [size=1em]1
    7 U5 N+ z( p1 l" l
    [size=1em]2

    * b8 A1 ]; t& W$ S2 c5 H  q
    [size=1em]3
    4 V3 O5 [) i* j7 L# c! n7 c# j
    [size=1em][size=1em] Base* pBase = new Base();) o: b* |) U% m+ p2 |& Q
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();/ Q% o- A/ p7 l# h8 V& s/ P
    [size=1em] pInterface1->func1();
    3 Z: ^& U6 ]0 P7 N. ]
    1 H/ n9 Q3 \6 W1 [% E. g3 a3 l

    ( E; p+ P% Q( y6 F6 O! M  R4 d: B" u: {9 b

    : A  \, [; O; L6 Z. C5 E2 y" C3 F8 I% V- k# G/ {' q
    6 G: m! B/ ~+ H% W0 ~. y
                  C++编译后,Base类的虚函数表如下:, p8 q1 N6 H: k. P. o3 `  ]
    [backcolor=white !important][size=1em]         PHP code3 W3 J' D/ A& C$ T
    [color=white !important][size=1em]?

    8 B/ q5 M1 }, ?* t5 k
    [size=1em]1

      B& Y3 t9 @2 t0 {; I( y# u- h* r
    [size=1em]2
    0 n# y8 S3 l" j  c) w4 g6 P/ k! ]' Y
    [size=1em]3
    # Y- C- |7 |8 b3 T( ~. j
    [size=1em]4
    ( x5 }. X8 g; f" H
    [size=1em][size=1em]  9 i2 g3 S, }; ^3 n
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    2 `. o$ z. |' {9 I[size=1em]  vTable:InterfaceU1 |Base::func1()|
    . _1 O7 p" z. H" }# A[size=1em]  vTable:InterfaceU2 |Base::func2()|% [- {: i2 A; q* W9 U5 u# t

    5 p! Y6 V: {& O+ p6 w

    # U0 Q0 K2 q, f( W3 X: T% I  Q: ^- ~. }, \  S) l
    % Y- C2 [9 k5 g

      w" F/ Z3 x9 l1 w3 s7 M     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    7 _& |% a" c$ l% N1 U& \0 k% y3 O    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。* b; T; |$ f  |
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    + S( k. o- @& Z9 s& C3 |    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定), D. X. f9 I2 |' U" B% D
    4 h. E8 r& `7 Z3 E! [' U$ {
    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-24 17:33 , Processed in 0.406259 second(s), 49 queries .

    回顶部