QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1745|回复: 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
    / h! H2 T6 ?4 K$ U) U[size=1em]      InterfaceU1
    $ e) p) m8 g; D! }( y[size=1em]  {
    ' a$ f( R4 X: K0 }% I4 |* ~+ `[size=1em]  public:
    5 s8 R+ e2 L' R2 [& e! ~, T$ h; n# F[size=1em]      virtual void func1() = 0;; a( m& g: Z- k2 \9 z* Q) j
    [size=1em]  }2 F, \. R/ ?# m" g% J5 v; O; i# Z0 A

    ; c* d, Z6 N/ W# E& g[size=1em]  class
    7 t9 K; Y% e5 |+ B& `6 _[size=1em]      InterfaceU2
    * v9 y( R# F9 S: ][size=1em]  {
    . W: L8 @1 ?0 m/ c7 V0 |4 |* |6 Z[size=1em]  public:2 e9 i8 q; \& a: I# r' P$ G
    [size=1em]      virtual void func2() = 0;
    7 Q( w2 q. ?; J0 a. Z[size=1em]  }
    - L: [/ P0 d, l: v  ]$ `  T" v/ f& R1 W
    [size=1em]  class
    3 m0 P& c$ t) W" i# K- _[size=1em]    Wrapper
    ) {! Q# b; [# H9 ^! i[size=1em]  {
    $ Z: ~1 u% M0 M$ C* r% {5 R; n2 W/ I[size=1em]  public:
    9 W- O/ `% ~. o6 E' E0 d8 d0 P3 m[size=1em]      virtual InterfaceU1* getInterface1() = 0;
    3 A: |9 N0 j7 x[size=1em]      virtual InterfaceU2* getInterface2() = 0;
    " f$ m; q* ]) I. v[size=1em]  }
    " K9 V  f" O$ Z9 n1 c& Y' b
    " N4 g7 I. D6 A$ a. U3 `/ ?" G[size=1em]  class  w6 S2 a( i# l5 v0 u
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2# K- V# d" o6 M
    [size=1em]  {
    3 z1 y$ l6 P% t5 X[size=1em]  public:
    3 i3 W- ]9 Y2 \' [# Z[size=1em]      virtual InterfaceU1* getInterface1()
    % O, \* Z5 C7 J; r2 i[size=1em]      {) h: ?6 q$ m( V, [" t
    [size=1em]          return this;
    . X2 L$ p7 J' W8 i% G/ X3 F1 m[size=1em]      }' J7 E/ a$ [! A- G) A* ^
    [size=1em]      virtual InterfaceU2* getInterface2()
    + ]" [" T0 M+ u5 }9 ^. ]/ M6 f[size=1em]      {
    # _0 X% m- X% @4 S3 K1 Q# v$ q
    [size=1em]          return this;
    . s/ w2 j  O- F* I[size=1em]     }
    ) M, G' p3 H/ C8 |6 ~; W9 v[size=1em]     virtual void func1()
    + w* a1 V: N- G  h[size=1em]     {
    4 I+ l7 e1 K: D4 D# H. S[size=1em]         printf("%s", "func1");- h" E1 z- g& Y/ a
    [size=1em]     }$ q% ]6 c1 X" v  Q( ^7 B; Q
    % w  Q2 a# Q7 a5 ~0 ^
    [size=1em]     virtual void func2()
    ! o3 W7 M# B# n+ E3 b' \5 F) ][size=1em]     {* p3 S. H/ @$ `) S( X: l% l
    [size=1em]        printf("%s", "func2");3 w* M- q1 k5 O: _4 X& v  N8 C
    [size=1em]     }2 h  o) }/ |: b" Z% o, S( ]
    [size=1em] }
    5 f- m9 o% b9 r  ^
    & q4 a$ j% t3 Z- z* Q, x  m6 w
    ! M# _; o  e' C, Q) K9 ^, O+ d. f

    : C9 o' ]# f9 {$ K7 C
      V2 p" V& y' |2 W% ?1 d4 v7 R+ A假设有如下代码:
    5 V0 T& b1 o- ]# |( w[backcolor=white !important][size=1em]PHP code
    , }+ L; I' I2 R; _
    [color=white !important][size=1em]?

      m* |/ U# T+ T$ f7 x" R2 e
    [size=1em]1

    9 [% g, [4 {2 k. R: x
    [size=1em]2

    $ A3 Z$ s# J8 h" |
    [size=1em][size=1em]Base* pBase = new Base();, m9 G. e4 R/ z
    [size=1em]pBase->getInterface1()->func1();
    + M0 @4 U# [/ }, W6 {6 I, Y" h: h, w; I+ x; d* \- w

    - i; p8 u8 f& `- _5 H6 g. L2 W+ D6 g% O4 g
      O) v. y+ E* \" R, g5 V
    其实以上代码等于:: `* K7 O5 ^8 \) C; M8 ~5 S
    [backcolor=white !important][size=1em]PHP code
    $ S8 r3 `. u- ~3 t2 r* ?
    [color=white !important][size=1em]?

    / |# G6 M& Q  W7 r1 ^! k$ ?
    [size=1em]1
    - L( i' _. Y$ l/ b/ e0 @
    [size=1em]2
    * W0 j1 y& X# G* f; {; `
    [size=1em]3

    * K% e4 `9 W" Y; @
    [size=1em][size=1em] Base* pBase = new Base();
    ' H' R5 n  Q1 _7 D( b+ k, U, Y[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    0 T- Y( w, Q5 h: D# o[size=1em] pInterface1->func1();
    5 I+ K. D7 `! |$ O' F9 e1 U4 l" z5 a& M9 X0 `4 G+ x9 W
    . z$ \  Y2 F; e* e" ?
    & m0 R. q* Y/ ]
    9 m% r1 j$ Y2 r# b0 z: o6 [

    1 Z( w9 e9 o0 y6 a5 L' V
    : M4 _6 @. j" s' z, _" `$ k2 k              C++编译后,Base类的虚函数表如下:: F1 n/ ?+ N- B
    [backcolor=white !important][size=1em]         PHP code
    ( D7 @/ B# t6 _
    [color=white !important][size=1em]?
    " B6 \  C7 D+ D$ W/ s8 y$ z
    [size=1em]1

    : u6 w8 j- @! Z' z5 ?, `8 _
    [size=1em]2
    9 P7 z! ?( f7 _) n: X8 X
    [size=1em]3

    ( j9 j' F8 q& Z( g) M$ z
    [size=1em]4
    & s) a8 H% T8 B. W* u- @+ j7 {
    [size=1em][size=1em]  ; I+ U8 T& [; J! g
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|; Z* L' b6 Z6 ^7 N* `$ @& t: u$ W/ c
    [size=1em]  vTable:InterfaceU1 |Base::func1()|3 i+ E! r1 |2 Z, o
    [size=1em]  vTable:InterfaceU2 |Base::func2()|1 y6 {6 o+ n$ }

    " J* _% C$ `; N( i/ K' r- G2 T

    7 n# x5 O) I1 C( L# b1 d$ C& q

    ! Y3 o  U5 J( n; m" M
    $ v# @, l  ]$ A% v' n7 f4 d     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    % A8 P0 E$ Z- O) g    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。8 D8 U/ O" k0 X+ \1 b
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?; p  j; ~/ e% g, K- i6 d
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    4 l7 N5 r% B6 L9 s( T! a, S4 z8 H; _9 l# ~
    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 20:07 , Processed in 0.557613 second(s), 50 queries .

    回顶部