QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2047|回复: 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]class
    3 F3 S. @, E: L) G0 H[size=1em]    InterfaceU1
    7 y& g% H3 h" \[size=1em]{9 a% G6 |$ r- P: x, w3 |. I, v
    [size=1em]public:
    / l  b9 \$ i0 K1 u! O; H[size=1em]    virtual void func1() = 0;' M( W. T! p4 [' N$ {3 @* q6 z
    [size=1em]}
    ' n" Q- H1 H2 [
    . V- d0 F/ Q/ `5 B: {' N  n9 c[size=1em]class
    : O& [( L( L* U2 F3 ^/ i  d[size=1em]    InterfaceU2
    0 K; U9 e& O" Q" p! l[size=1em]{6 Q* F1 G7 y) B) G2 t& n
    [size=1em]public:
    : r. s9 O4 \8 b; X; e7 a: m' z! {. f[size=1em]    virtual void func2() = 0;5 e$ b; m& l' \* _# f- V
    [size=1em]}7 q9 k4 {- B. B. A5 o+ `; y

    ) S, n- k; S, X4 M[size=1em]class9 d3 ~/ O! [9 k* z( |' ~/ m  D
    [size=1em]    Wrapper
    % c$ q0 Z+ A$ W2 ?+ m  L; r[size=1em]{
    ; g, z- ^. x: O4 V& H[size=1em]public:
    4 c: g) @/ G5 V7 c[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    / y( }# o  f) G( t  D1 F[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    1 L# H5 a- n% ~! E) f5 f[size=1em]}) |& f7 e" s# [, K( k

    0 ?3 N8 u3 L0 f; L1 b[size=1em]class' f6 `8 ^7 D4 Z* R* q
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2; q6 E9 b) z8 h- B- d+ ]2 F0 S: S+ }
    [size=1em]{
    ' W8 R3 i* k0 v# U# M[size=1em]public:
    & K0 A) z! C- v1 Y3 U9 L[size=1em]    virtual InterfaceU1* getInterface1()" m5 [3 U) M; Q1 h1 x  N
    [size=1em]    {3 n# q! c) ]5 g3 P' t, m
    [size=1em]        return this;1 t- S7 V' U% m
    [size=1em]    }( [' i2 f: E( S) J' B
    [size=1em]    virtual InterfaceU2* getInterface2()
    4 V) l. q2 P( ~& f[size=1em]    {# y  H& T4 o/ k+ X/ {% L
    / o  ~' p  n+ N2 M7 ~( w. W& I; v
    [size=1em]        return this;1 v6 d% D$ K- g# I! s% _. j
    [size=1em]    }2 Y& p/ y$ F3 ~- w
    [size=1em]    virtual void func1()1 Y& l- s- e# m+ c! V
    [size=1em]    {
    ) g& f% R) i2 w' D) k$ k[size=1em]        printf("%s", "func1");
    0 ~- E) E7 A0 u$ o4 Y[size=1em]    }3 n4 T4 _* y1 D$ ~9 x# U+ H" D

    3 L* A$ o3 d5 u4 V$ y+ }[size=1em]    virtual void func2()( d& }  H6 g0 @9 K
    [size=1em]    {( ?6 ?" |' f8 R2 U+ }
    [size=1em]        printf("%s", "func2");
    # }, F1 A" H, U  Z9 J6 I[size=1em]    }
    6 v( B7 ~/ h! u5 u[size=1em]}
      G$ r' O6 _& N' x; t/ B2 \# U4 C2 Z
    0 c* b! D' ~9 }/ F

      |5 j- T8 D4 Q9 T/ G
    % |4 v1 B$ s& ~9 q" ]- l5 G5 `; k假设有如下代码:
    " ?( P% k* ^( _[backcolor=white !important][size=1em]PHP code
    6 Y1 f. y6 n; ^
    [color=white !important][size=1em]?
    / U$ `4 w6 V( t7 `& @6 y: L
    [size=1em]1
    ! @4 r6 Z- m3 W; k
    [size=1em]2

    ' i, u: t8 l4 M3 x0 m1 T  z9 V$ a* v
    [size=1em][size=1em]Base* pBase = new Base();: M0 N& z' o$ `# P9 I9 O! e
    [size=1em]pBase->getInterface1()->func1();
    # I, i+ C6 ]  x# Z$ e' g- S( o
    : v( E/ f" d, a& o! v2 x

      k& }# i9 `% ]% l/ M6 N3 ~. A" b
    8 Z' u, d9 p" p8 g" e% L- O0 P
    ' v9 U4 Y% l- P/ s, @& F& i* |其实以上代码等于:
    # }$ n7 d" n& k9 w3 M+ D8 Q[backcolor=white !important][size=1em]PHP code
    # n4 U, L8 ]/ c5 _
    [color=white !important][size=1em]?

    # {! p8 t' o) {, Y' c( {2 r! ]
    [size=1em]1
    ' K: S, w8 o8 T6 `3 B" j
    [size=1em]2
    . q, m# [, T0 W
    [size=1em]3

      l( k. s# Q/ x% \, O* e
    [size=1em][size=1em]Base* pBase = new Base();, I! {# Q) |+ `, y
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();3 U; ]6 n2 I6 g, c' G- w
    [size=1em]pInterface1->func1();
    3 d6 C1 J! X3 O6 a+ m- d* G0 m% z' I. U  M3 D, g0 r/ F
    8 W4 d2 i' _- r& F4 b9 Y

    ' m9 [  [9 \" U5 Q4 T& k
    3 {$ o$ u% l& \/ U) W
      K# g5 U. @' P2 V- C3 s9 b
    ( w. }5 e1 L* O2 k6 ]$ HC++编译后,Base类的虚函数表如下:( Y% V3 a7 D* r' J. d
    [backcolor=white !important][size=1em]PHP code
    7 e+ R) N" \- U
    [color=white !important][size=1em]?

    ) d: H; P4 E! b% @; t
    [size=1em]1
    ( ]  w  c' ?' I* p
    [size=1em]2

    # q3 k+ Z$ C+ O, `% I: ]  p1 b; V( Y
    [size=1em]3
    0 e3 C+ I, n/ l4 Y4 J0 S8 b7 I
    [size=1em]4
    . A- f# O& T5 \2 g' ~( Z! [
    [size=1em][size=1em]  : D! b. {! d$ @0 W- q4 B* z" O4 ^
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|5 c. ?2 i: ^- {. z0 u: g" `: m
    [size=1em]vTable:InterfaceU1 |Base::func1()|5 b  S* ]$ t4 C1 m
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    + s) I# j' u/ S- g; T6 S. ~8 V  H8 }# Q9 X% ^" j7 s- I
    9 y/ g* t9 b# }& l5 s
    - c* U7 X9 D* N- f

    / @  ~2 l  Z8 m( F# z4 E. c8 P; I+ g- y! l& {! Z) T
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。9 w6 I' G$ Z; e. {$ ?
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。+ c! F2 g; ]# P; D, a6 m- r$ b( c
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
      Z4 n7 i9 Z4 K! I" J/ U, h. GC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)$ E6 ^9 x4 d2 p" ?; F3 u) k0 B: w
    $ k! T. H$ l- [: g. `! N
    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-20 16:26 , Processed in 0.424615 second(s), 53 queries .

    回顶部