QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1744|回复: 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
      `% q1 x6 x2 x+ \9 O[size=1em]      InterfaceU1
    ; f; [; U" V+ c3 A[size=1em]  {
    6 ]; Z; I& o' y: }, N- ?' @* d3 `: A[size=1em]  public:
    5 f! i/ p" e- o[size=1em]      virtual void func1() = 0;$ c$ @) I2 z* p- f
    [size=1em]  }
    8 _$ L0 X( t% i& J. T
    6 @# H1 U+ X. p; J1 Z+ A[size=1em]  class# C, z- j' z6 m+ s3 M: E2 _0 J
    [size=1em]      InterfaceU2- v! n7 O7 Y! W7 E7 M9 r
    [size=1em]  {7 Z8 r) M' p3 J# @- ~
    [size=1em]  public:
      O2 x6 {4 t+ y" ~! w[size=1em]      virtual void func2() = 0;# C5 r) v: m& C# R* l# v
    [size=1em]  }9 J* M+ D( E" \, C# S
    & X' h5 _0 G$ {* a# X7 h
    [size=1em]  class9 {% ^* w* A9 P, O( d0 n: l- s. K
    [size=1em]    Wrapper
    ' P! {% k0 m9 X% ]) s8 M" J& u! }[size=1em]  {
    ; h. M( F$ j$ _8 Q( u/ c& w# F9 L[size=1em]  public:* ~# }+ h- U+ V5 ]  x: ]
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;# c2 v& n" F' n: l5 Y) Y
    [size=1em]      virtual InterfaceU2* getInterface2() = 0;; o: m: N. f) z( p3 }) D
    [size=1em]  }6 Z# a$ ~: ?' e
    * t  z# ?. Y9 a. P. U
    [size=1em]  class+ u- ^& r7 _- |' X* y! v
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2
    1 S" ^8 R  y0 k0 h( z9 e0 r1 w[size=1em]  {% g/ M4 ^5 @0 q: G$ G8 d7 h% W$ o
    [size=1em]  public:
    " v3 t, M$ j: y. h! _3 k% T' F; ^[size=1em]      virtual InterfaceU1* getInterface1(), J, v: b" x- g: l* E! p* [
    [size=1em]      {0 f' u9 w9 z$ u1 \4 K
    [size=1em]          return this;
    3 E3 e, S$ {1 k$ |3 U" d6 q' v! D[size=1em]      }
    ) F3 Y) F8 d7 g# a  C[size=1em]      virtual InterfaceU2* getInterface2()- l& ]- `; ?. a, A' N+ U
    [size=1em]      {
    7 p8 ~3 \. z8 N2 H% {2 r$ y  a6 ^9 d  b
    [size=1em]          return this;" ]8 T. }0 Y! Y4 f  u" S
    [size=1em]     }/ |1 e) v7 \  f8 R/ f" O7 M0 W
    [size=1em]     virtual void func1()
    + P, A3 h! u) V[size=1em]     {
    # l. X: ^4 G! ?. a7 i9 \[size=1em]         printf("%s", "func1");* I. Z& s* O$ l$ ?; ^  d
    [size=1em]     }! n( ^- e: i* K

      n& ^! H4 a  |" J( }[size=1em]     virtual void func2()
    * M! x5 Q+ M! c+ K% ?! z( c[size=1em]     {
    $ ]% D4 b: x7 s0 \- x5 r[size=1em]        printf("%s", "func2");5 I. v0 U  y0 X% V7 B& Z
    [size=1em]     }
    7 ?+ v" ?4 H3 P8 H[size=1em] }
    5 \) g( e) v& D; l& v, Z& L6 J# d8 t5 `# n) b
    # B+ q8 H0 i; X6 H9 P' `

    ' f6 @# H; Z! K3 W3 O  J+ g
    5 J( ~+ X; t/ G假设有如下代码:
    7 T$ h( P1 w: ?; r; ?8 Q* Q[backcolor=white !important][size=1em]PHP code
    + A: a, q. ~8 z" E
    [color=white !important][size=1em]?
    ' X+ m4 v' T: n) }$ T
    [size=1em]1

    1 K% H' g7 j: R
    [size=1em]2

    8 U& V3 |7 W, ^! b) ]9 x
    [size=1em][size=1em]Base* pBase = new Base();, O* s1 t1 S- {, H! A/ H
    [size=1em]pBase->getInterface1()->func1();
    - C5 A8 P3 m4 d  Q
    3 U! o# X- L+ x9 r
    . K5 B6 P- h5 d/ z
    + W+ [: c) d+ ~
    8 Z- w9 e0 S6 K$ W8 x# ~/ z# x0 q
    其实以上代码等于:) g  c" R4 a: B# |! G
    [backcolor=white !important][size=1em]PHP code
    / }1 E- n; l1 W
    [color=white !important][size=1em]?
    $ K( \/ _5 D; b, I. R9 b+ y! c( W1 x
    [size=1em]1

    ' t9 e. J8 N( y! A
    [size=1em]2

    5 x" [+ Y% |# z
    [size=1em]3
    7 \2 E; R' X3 m
    [size=1em][size=1em] Base* pBase = new Base();
    3 X* o: G0 |/ H" @+ s; c[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();( ?1 Q- B2 ^) `9 y
    [size=1em] pInterface1->func1();
    4 U$ ]- ^2 s; D9 _; }' W
    ! U$ |1 P5 O% |; E
    : p9 v) m/ B. M- i8 E% e: Q
    " J1 P# p1 M+ P
    3 t0 f9 S9 R+ U  C( K% }. [3 X0 p
    * ^+ i4 c, ^# |2 |) O, g) m

    / w# N  S' c0 h& X$ Y$ H4 Y3 w              C++编译后,Base类的虚函数表如下:+ r# x* t0 z2 O4 J# p
    [backcolor=white !important][size=1em]         PHP code
    ' m' r1 l6 B2 r3 U  @4 [7 z
    [color=white !important][size=1em]?

    & E1 e3 Y& B1 Z& c' n
    [size=1em]1

    5 C6 w5 U5 ~! q  r5 ^( s$ Z
    [size=1em]2
    ( d0 d5 F' {8 v+ m
    [size=1em]3
    ' i. Z8 |1 U1 y( y. F; w
    [size=1em]4

    ; X- x8 c: \5 [0 w7 Y+ ~, p
    [size=1em][size=1em]  
    " S. H% L. Y# x% |" _8 r[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|; _" Z& y0 L4 V4 K+ O
    [size=1em]  vTable:InterfaceU1 |Base::func1()|
    3 k- l$ Z) S, j7 l[size=1em]  vTable:InterfaceU2 |Base::func2()|( w/ Q1 G: v" T3 \; @

      J( e1 }' [8 T8 a6 n' }/ Q
    3 q; s8 A8 G% Q$ q8 `* E9 Q9 d

    $ j2 x4 r( k/ {% |; R" ^6 Z5 x  n2 G7 g8 A- ~5 ?6 d1 m

    5 W# P! A3 Z# R+ H0 `     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。0 w5 _# e, w% X- U- Y% _) y; B
        但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    3 m1 n! [$ s: v( J: r    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?5 b% j' l& y( T$ O; ]5 K
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)5 L% x. |, L5 I! x( b1 x

    6 @2 n& g& J* T6 V3 F' v& r1 U, W
    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 18:59 , Processed in 0.308783 second(s), 50 queries .

    回顶部