QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1620|回复: 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]  class3 k' H- {8 ?7 }$ T' J
    [size=1em]      InterfaceU1$ O; _, }1 {6 K- h3 o: ^& q8 S
    [size=1em]  {' H# ]$ B1 f. V
    [size=1em]  public:, c( L- ^0 N; G
    [size=1em]      virtual void func1() = 0;
    2 Y" o- r  B! m$ K[size=1em]  }
    ! ^% @8 B7 J6 g1 v5 s
    / K3 H6 w9 U3 k! T2 O3 Z[size=1em]  class1 N0 I8 T/ D+ o  f! d, b" O1 F
    [size=1em]      InterfaceU2
    + J+ c" S3 q) J9 A+ l" _[size=1em]  {
    8 o$ C. u. z# M2 Z  `5 k6 J' _[size=1em]  public:. y, G  i- h6 X' b' @
    [size=1em]      virtual void func2() = 0;
    1 e9 ]: D+ w' j8 O9 Y[size=1em]  }, K- k, d# o9 v# V( @
    9 L! l( ]+ n! `4 k5 t1 T1 U. ?
    [size=1em]  class/ H& t1 F5 g) f" v+ \- x3 K$ {+ C
    [size=1em]    Wrapper- b4 h" [: c# C# _& \9 R! H
    [size=1em]  {2 s  i# a3 n0 }8 u, H7 p
    [size=1em]  public:3 ?1 y0 S) ?& _% m$ T
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;
    4 V  K; |! A8 e[size=1em]      virtual InterfaceU2* getInterface2() = 0;
    ) n8 W8 D4 W' v[size=1em]  }
    ! Q0 M1 V3 o! o7 j9 P& `
    0 }  A2 ^  {5 a0 F: }: h[size=1em]  class
    ) Y. l% S1 K$ m: X  A6 B) W[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2
    % N3 ?+ g$ o0 W( e- b1 B4 u[size=1em]  {
      u& x2 _! n7 o/ R+ @8 C[size=1em]  public:8 m. T; W$ Y7 [
    [size=1em]      virtual InterfaceU1* getInterface1()
    2 J# ]3 P* V1 J2 a/ f3 O[size=1em]      {* M# J4 }, m! N' k' X- x
    [size=1em]          return this;
    9 @* Z, V2 Z1 e* v[size=1em]      }  c! \7 Z* {3 H; [8 U: \5 [
    [size=1em]      virtual InterfaceU2* getInterface2()
    , ~, x+ W' L, L; b[size=1em]      {
    # a" d" M  ~) B4 [
    ' t& E+ \' d6 e9 x# j( r[size=1em]          return this;5 c% b9 W, g7 K; v5 j/ w, e
    [size=1em]     }' m/ z1 g1 |* ]) F
    [size=1em]     virtual void func1()
    ' u, U8 K" ?8 p  ?+ k[size=1em]     {# ~4 i5 w8 I. c
    [size=1em]         printf("%s", "func1");. j5 z; `' q  y, @' R
    [size=1em]     }  _2 q6 a9 X6 P7 {) t+ O

    3 W5 q# r2 O+ h3 H: F9 G[size=1em]     virtual void func2()  ?0 b* h* n, O; a" v' v
    [size=1em]     {  {, F4 u% B  A9 h: b0 c1 G+ y
    [size=1em]        printf("%s", "func2");
    1 @+ {9 I8 u$ r" u0 c, G3 }9 c5 I- U6 _0 b[size=1em]     }6 Z0 a! a, u8 @% E/ v! Z) K, D
    [size=1em] }
    9 Z" Z# c* [" l# e- [  E
    ! e) a' |5 h& r, W! ?$ ?
    : s* V/ X( `3 H; M; E) w

    8 \5 F4 r1 N% g5 W  k
    , y: ~% O- O( t" m# n7 H8 f2 O3 e假设有如下代码:% `( o2 I; c7 m) J3 d1 y) `
    [backcolor=white !important][size=1em]PHP code4 g5 s3 h0 m, l3 H1 Y3 |
    [color=white !important][size=1em]?
    ) U: V0 B3 @  y7 v8 H  g
    [size=1em]1

    0 v$ G6 X+ f, @0 A6 [6 B! q
    [size=1em]2

    : w1 B( `# c1 C
    [size=1em][size=1em]Base* pBase = new Base();" B3 l5 I3 O5 n
    [size=1em]pBase->getInterface1()->func1();
    6 F+ `- ?& x0 e& K# I1 V/ u
    1 O+ o, N4 b4 g' n( D
    ' w1 B( }  v. L1 A
    : L6 B+ U6 P2 ^9 N) E3 g
    $ r: n& L6 y, P
    其实以上代码等于:* A" d! b/ A9 `1 _. D/ ?/ _
    [backcolor=white !important][size=1em]PHP code
      K; d6 B1 O: \
    [color=white !important][size=1em]?
    / t1 S3 E* t! P4 y( L: r  M# o9 S
    [size=1em]1

    $ j1 Z% x9 N2 l" t& j1 V2 ~1 p! K" u
    [size=1em]2
    1 t  v  C! N; G1 I2 }
    [size=1em]3
    4 d" ^' Y2 t7 x7 y  ^8 X
    [size=1em][size=1em] Base* pBase = new Base();$ `, w& B( J- @# T
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    / s6 I4 j8 r, {% b% K/ R[size=1em] pInterface1->func1();# [$ g1 j/ r7 V7 ~6 U" |. m  z
    # c1 h6 q$ `, D5 L; y
      O% H- F* l+ w
    7 ^! c2 D) L5 t: u  m  w9 s: u

    ( y, m; W2 ]+ c$ e0 A/ I9 x' {8 w2 F/ K4 I8 E% k/ w
    8 _; h3 ~- X6 h) x4 r* K9 r7 {+ B$ I8 x% @- o
                  C++编译后,Base类的虚函数表如下:0 Q# A' s+ l, ~4 u& A6 L
    [backcolor=white !important][size=1em]         PHP code
    " f  s$ @% ?) b! i) U
    [color=white !important][size=1em]?
    5 q5 w+ \& q" Z( R
    [size=1em]1
    & X( H8 _* q6 N6 o' @
    [size=1em]2
    4 u7 L* }8 D# {% U: n1 f
    [size=1em]3
    # d( U' \9 P( m5 i- j
    [size=1em]4
    & k1 n5 f" D: o& k
    [size=1em][size=1em]  
    2 z6 D6 _# B8 }$ j+ F* g3 n[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|5 _+ S+ y: B* O
    [size=1em]  vTable:InterfaceU1 |Base::func1()|7 W! G. c% X" f& t: g' q( j/ y
    [size=1em]  vTable:InterfaceU2 |Base::func2()|
    ' H" S4 c+ @8 N8 E- E( Y# e3 L  t+ a/ v% o) g/ J! K
    7 H, E2 v' L3 b5 F, {' B) E
    " W7 w4 k6 b$ i0 b# ?3 }1 S
    , A  {( U* Z, L$ G7 @$ c

    " G; Z, E3 F5 `: t$ I) j     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    6 Y1 \, s: e5 S6 ]" {    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    & l' B" z: M3 k    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    0 @6 f2 q7 ]9 M! `1 i: h$ H# M    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)* M3 ?! F  ~6 Y/ q

    % E" Y6 ~. f# ^9 {
    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-4-10 22:55 , Processed in 0.393691 second(s), 50 queries .

    回顶部