QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1672|回复: 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. Z' n5 |$ G# e/ v
    [size=1em]      InterfaceU1. E/ W6 M$ F9 I- C4 ~$ g; m
    [size=1em]  {
    $ t7 f5 r# o4 u( c; X[size=1em]  public:7 [1 H0 I- h; q5 S
    [size=1em]      virtual void func1() = 0;
    ' i  h+ V: a7 _[size=1em]  }- i1 W# @7 u0 ?$ E

    4 V* G6 J% W" i% |' k% W8 Y3 H[size=1em]  class
    2 l/ j- z- H4 U  d2 L: w[size=1em]      InterfaceU2
    ( a+ N6 g* m: v+ _- k2 j6 k3 K[size=1em]  {! T: Q/ X& H* C9 l2 M
    [size=1em]  public:' {) V# S" \; E8 A
    [size=1em]      virtual void func2() = 0;
    4 v( d! U8 ~( [8 ~, X/ E[size=1em]  }
    " }6 B% y2 {2 b! O% N
    * O" f8 _$ N4 G: t4 q1 z$ T  d$ f( w" J[size=1em]  class& F0 O& J/ V: ]2 G. U* b" ~! N
    [size=1em]    Wrapper
    % V2 t% f' Y  C1 y( V# B5 N[size=1em]  {
    # L% q* O: F3 r  h2 V  v) V[size=1em]  public:
    ; P! ~6 Z6 G8 D% e- M9 A0 C: z1 Y[size=1em]      virtual InterfaceU1* getInterface1() = 0;. F7 q- ?0 E, s# u9 L! ?
    [size=1em]      virtual InterfaceU2* getInterface2() = 0;
    - a4 ^5 m! X5 f# H. `[size=1em]  }9 {  z# q, j2 Y: a- o9 ]6 p

    + J9 [  K0 @7 S) t[size=1em]  class
    " H( G5 x3 A7 U% f# V[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU21 D* q* P4 Q' M7 Y" Z" d
    [size=1em]  {5 A# @# O, a6 m! B1 Z. n+ w
    [size=1em]  public:. D; A5 I, a- }1 V- r: l. Q6 ?
    [size=1em]      virtual InterfaceU1* getInterface1()' Z' Y! _# \' J4 G: i; o# ?. I/ F+ I
    [size=1em]      {- d2 x* K: r; R& g9 c
    [size=1em]          return this;
    8 l; }% x2 F, X0 M) {' l[size=1em]      }
    ! g- w2 X; g) `# E& `; S: E0 g[size=1em]      virtual InterfaceU2* getInterface2()( D2 t" o4 B1 L  D8 R- O
    [size=1em]      {8 D0 H/ Q) L& t; M

    * x9 K" F. p- U! \, L[size=1em]          return this;
    $ p6 A6 n2 c; G' L' ~) Y  [[size=1em]     }$ v4 `6 q% g( y
    [size=1em]     virtual void func1()
    5 `" k7 a2 j  o- G; i1 _. _" v3 D& Y2 Y[size=1em]     {7 d+ K7 y; R- U/ l! e% A% D: p# C" r
    [size=1em]         printf("%s", "func1");
    1 I3 B2 H$ X: W. K[size=1em]     }
    3 L4 }5 G4 u2 m) \. b) H7 f* D( u1 q/ a2 W
    [size=1em]     virtual void func2()1 I+ y& x7 L- K) U: V* V5 ?) a
    [size=1em]     {
    ! f) C  }, n( L9 k[size=1em]        printf("%s", "func2");
    * F+ x$ T, H+ k/ H4 V) i2 a7 \) ][size=1em]     }
    & S/ X# N% P/ f, P: B* ~4 e[size=1em] }& F! g( ~: V( o
    + j, G" w& u- p! \5 k4 [
    4 F; ]4 m/ O3 n! ~' q
    - Z6 J6 W6 A( _  A

    ; x$ l% h0 _+ l0 t9 H, p7 H# `假设有如下代码:
    # H3 V* v7 T2 q, `[backcolor=white !important][size=1em]PHP code7 P# h' v8 N0 t8 @1 G& }' [- X
    [color=white !important][size=1em]?
    $ i0 O4 w) J$ ^4 i3 T& `; f# {
    [size=1em]1
    6 M3 P* {2 z' `8 X' a3 D, R7 L' E
    [size=1em]2
    8 @( ?' A+ L  o: W8 g
    [size=1em][size=1em]Base* pBase = new Base();) t) R7 |6 E2 P/ [1 c
    [size=1em]pBase->getInterface1()->func1();8 F! |+ L. T6 l: N! R' r% q
    # X+ t; V6 W8 t) ^9 [2 C: o

    1 A4 _- X- b: s& z  m/ ^- w. ?% q

    5 B, k7 p: k- S# w- C2 @* N其实以上代码等于:" g+ X+ I  ?2 E' l
    [backcolor=white !important][size=1em]PHP code+ Z/ J$ M( R9 c# j
    [color=white !important][size=1em]?
    0 h4 H$ R/ w7 S" t2 L2 l- j. \
    [size=1em]1

    / G" {7 {8 w8 H+ N$ x' k/ n5 M
    [size=1em]2

    0 O/ N1 Y2 b+ G) d0 J5 i5 ]5 U
    [size=1em]3

    / a7 h% ~& @, V
    [size=1em][size=1em] Base* pBase = new Base();- ^2 _5 W2 B' A% K$ z' H: q
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    , ~, r% C  E& q, r( a, ~[size=1em] pInterface1->func1();
    6 L  g( f  t1 I% [: l
    1 J! K* @% v/ e- C8 |; O
    ( e$ H# l1 ^  f" ~+ y# @
    0 r0 h" E# T; b3 L4 M

    ( _- r1 Q5 l; L; X1 B
    , M: k$ ~5 c$ `  l- b2 e: W+ y* [5 I8 N! `+ H- w. g
                  C++编译后,Base类的虚函数表如下:3 m& ?% S( }; H/ T3 n& J# ?# D# ?
    [backcolor=white !important][size=1em]         PHP code- ~9 q- [& E- {/ y
    [color=white !important][size=1em]?

    : i3 v1 a) S; e, h% D) s' D
    [size=1em]1
    3 T$ |# U: Y& N% T0 V9 \
    [size=1em]2

    3 t- F; d& @% f6 t( }: E1 L
    [size=1em]3

    + o4 K  q! S& H# T% x  A
    [size=1em]4
    9 W  N  D: c8 Z( I0 V
    [size=1em][size=1em]  - T2 U# x4 C& ]* O/ D) S
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    ' c5 m1 @+ [& D) Z' s[size=1em]  vTable:InterfaceU1 |Base::func1()|( ^4 U- O% o  w: R
    [size=1em]  vTable:InterfaceU2 |Base::func2()|' C- t% z- O# e
    7 U, Z4 v0 h( ^5 R- O

    " _8 t: l# m6 y; c
    & I  x6 v  J5 n) r0 o* B; ]# {% B  J1 L

    / _8 R% y6 H  s$ E& ~     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。* ~( \! X! `. v* c$ b3 |
        但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    + i- D( f) N( K, ]6 [5 B    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    . E  E2 C: o8 y- P) r; Z    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)2 S. @- l; g3 X+ K# ~
    ) c- V# P# f4 D1 W. y
    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-6-17 23:28 , Processed in 0.459171 second(s), 50 queries .

    回顶部