QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2014|回复: 0
打印 上一主题 下一主题

C++ 中多继承情况下 如何确定某个类型的方法,在虚函数表中的位置?

[复制链接]
字体大小: 正常 放大
蕾欧娜        

19

主题

9

听众

25

积分

升级  21.05%

  • TA的每日心情
    郁闷
    2015-4-14 11:21
  • 签到天数: 1 天

    [LV.1]初来乍到

    自我介绍
    德玛西亚
    跳转到指定楼层
    1#
    发表于 2015-4-17 09:47 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    [backcolor=white !important][size=1em]
    [size=1em][size=1em]class1 h" L2 j: |, j1 S; k1 o" K5 n
    [size=1em]    InterfaceU1' I- v+ Q1 [1 F
    [size=1em]{9 J8 X8 `2 B& t. _+ N" J" H
    [size=1em]public:
    1 e' s2 D  @# B, z' f  D+ f; b[size=1em]    virtual void func1() = 0;) F/ U, E, n9 J4 ^! y* Y' h" c
    [size=1em]}
    ' M! b  J  q3 R9 p9 k7 H2 m0 `+ G* M: W% d' ^7 V3 Y! ?
    [size=1em]class" o* D" ~: L- D0 t! i  [0 A/ T* O* X1 F( I
    [size=1em]    InterfaceU2
    & ?$ m5 q/ j# Y8 }9 C% S  O[size=1em]{" t: t6 J' c5 s
    [size=1em]public:
    8 M$ M& o* P- H* f[size=1em]    virtual void func2() = 0;: O, L  Q/ {# }7 U' s
    [size=1em]}% Q- ~2 }7 |. a3 z
    ) m3 K3 p# {7 a, M6 V
    [size=1em]class
    4 I6 w1 I4 I% w[size=1em]    Wrapper
    ) F; y& B, A' `; o" t* S* r: ^[size=1em]{, b9 j& I! C! a
    [size=1em]public:
    ; T) J8 W6 {+ s- p' }  c' V4 y) ?( M[size=1em]    virtual InterfaceU1* getInterface1() = 0;; c7 q) O$ ^$ q* N  Z/ o( X
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;
    ) k% F& u& i( \, k  F* n3 C  t# {[size=1em]}
    5 _. v! m- S- u: S3 S& A+ ~; }3 F* q# p9 D5 H) i4 {4 i1 I0 Z
    [size=1em]class$ f2 h  j0 c* u; P0 r4 t" F
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2: X( s  @* {4 Z, m& C& H/ |+ K
    [size=1em]{
    ( Y; z+ j: e8 Z, s/ `& }[size=1em]public:# Y# [% B) t: {" j5 ?
    [size=1em]    virtual InterfaceU1* getInterface1()
    ! O# G7 X8 U6 N& x& c[size=1em]    {
    4 v( g5 `' @6 O1 x1 r[size=1em]        return this;
    7 w. r. K0 s! c  z[size=1em]    }
    ! g& Y2 m  t' w6 }4 I3 l[size=1em]    virtual InterfaceU2* getInterface2(); H! E9 `' A( o* T, a8 j$ Z5 m
    [size=1em]    {
    " |  b2 Q* y* I, w% y: M/ l3 `& v3 ?* a" J; A( d& {4 ?1 k) D
    [size=1em]        return this;* F: {% W( ]/ h. z
    [size=1em]    }
    % E# x% e5 w; L( ]* R# m3 {" a[size=1em]    virtual void func1()
    / X  o& u. V* s6 s8 Z2 R[size=1em]    {
    # h5 c6 p! y, \  W$ R[size=1em]        printf("%s", "func1");; b! X+ G  o- {6 }, x8 @  S
    [size=1em]    }
    . k5 j5 v" M/ h  P
    4 r3 {  E; U; g) a3 V! v[size=1em]    virtual void func2(). ?. B7 F# P7 @/ g, {7 S" `) m
    [size=1em]    {
    6 W* n' [! J: D# X5 |: a/ K[size=1em]        printf("%s", "func2");$ t9 t6 e& z# t& I' ]5 z1 q4 w, N3 K
    [size=1em]    }' W4 N2 P% _( G5 d7 Q7 ]
    [size=1em]}
    1 o! f. w$ M8 W9 ]! T5 z
    & t6 R# G( h4 M; \1 u$ l

    ( R% w' K! Q7 p2 C7 O+ n1 g8 j
    9 l' s. a% g& m' Y% s

    ) v% G( g5 G" ^' [; h假设有如下代码:% F/ \* ?' J8 t2 H; _8 |0 R
    [backcolor=white !important][size=1em]PHP code6 }* x" M1 G4 U
    [color=white !important][size=1em]?

      c" m3 M6 t9 H
    [size=1em]1
      s5 L' B/ d& o$ ]
    [size=1em]2
    2 Y# c  G) ~$ u$ C! X$ \. o
    [size=1em][size=1em]Base* pBase = new Base();
    ! F- X/ f. X6 u2 b9 y& n4 Q[size=1em]pBase->getInterface1()->func1();
    . `: W7 M  V. c( b7 G! X3 z0 }* }7 v: K3 Y* {1 J

      e& `1 i$ x. U( S* m4 j- j4 t. ^8 X* @$ L. E
    # F! ^, Q1 G' {4 L: R, l7 e3 S
    其实以上代码等于:8 \% Y# y9 B/ `7 @7 r
    [backcolor=white !important][size=1em]PHP code
    ( T  o: ]8 c. `( K/ J5 [
    [color=white !important][size=1em]?

    ' |" l+ Z0 }: `; Z' L$ g+ O
    [size=1em]1
    : W" k6 \8 X- J; @8 q5 G/ T
    [size=1em]2
    1 v3 S7 r% p0 t2 L5 e# M
    [size=1em]3

    9 N, `# `: e( p5 d' ^
    [size=1em][size=1em]Base* pBase = new Base();
    . v, d; G) x5 u( ?4 h[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    ( |$ g7 [: ~4 U[size=1em]pInterface1->func1();
    ) ]. m7 W) s8 f5 }$ `3 o( R4 {, w1 j7 k0 h2 h# E0 m

    , N8 C. d( L2 R1 p  u1 L% v* ~
    + A- F0 x, J  @* z; B- j: x7 q/ Y! ~& m
    ' i* ^1 W; q# h8 A
    + j/ o2 s  `$ e% g1 z& A
    C++编译后,Base类的虚函数表如下:) q6 B  a8 s: f. I1 f6 h* I. e1 ~
    [backcolor=white !important][size=1em]PHP code
    / Y5 s  O+ j1 |* A& v
    [color=white !important][size=1em]?

    7 J/ N% t) p8 l! E, Y. p6 _
    [size=1em]1

    * x; K$ _2 N* _0 |, A8 p9 I
    [size=1em]2

    7 j* V' C- {5 K) t4 B" h5 ^3 K
    [size=1em]3

    2 q' b0 y; y6 w& [: [; g( @- X
    [size=1em]4

    4 S; j: M7 a0 P4 A+ u
    [size=1em][size=1em]  - ]% I3 N. @2 Y0 H
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    0 \: s9 \+ P! h[size=1em]vTable:InterfaceU1 |Base::func1()|3 N/ I5 M1 Z, U# k
    [size=1em]vTable:InterfaceU2 |Base::func2()|4 @( N8 Z9 M& ~: y; m+ Z9 T0 [& r

    ; q) \. ?, d6 T+ z6 ?( c

    , n7 P! \0 V; e& C9 E! n: {8 o7 v  m

    5 Z+ I& }, L6 T) c# T
    6 h- r1 U6 T2 \4 R如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    9 ]7 W) R! I8 p; f但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。5 p0 O# T2 F  I/ S0 D' e. J( k3 Y
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    " @% A/ @  N( k1 Y% u  pC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)- }- k, g3 |4 }1 J, r

    ; P! }+ q, \1 G) F# d) y' H( D2 p
    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-15 00:47 , Processed in 0.421752 second(s), 54 queries .

    回顶部