QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2119|回复: 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
    & b  M, \# ]; @: L- s[size=1em]    InterfaceU1
    0 u: m- H3 ~# C. h$ u$ o[size=1em]{
    * l8 ?, }. P1 O9 j+ y[size=1em]public:% Q7 s- W2 \0 Z$ I- @' `
    [size=1em]    virtual void func1() = 0;3 t) W% v: T, p
    [size=1em]}/ X8 T. E( M" K4 X! F& n: z
    5 i* Q9 v& K3 C4 `* m9 F$ _. R
    [size=1em]class8 e( [2 j2 Y) A) T% D/ v; t4 L
    [size=1em]    InterfaceU2
    6 [5 F4 y, ?. j% U2 m& u[size=1em]{2 }4 {& l# O) N* Z9 r6 Z6 l, o
    [size=1em]public:, j, Y) \. Z2 ~7 \( L/ q/ A
    [size=1em]    virtual void func2() = 0;4 _" e& D9 d- a) z1 E- u, c
    [size=1em]}
    7 G$ {4 ^% U2 L$ a5 |4 Y
    2 S9 A$ f; c) e! H* F[size=1em]class
    * `0 o+ t$ d5 a[size=1em]    Wrapper! X4 P% R& C4 H- J7 P* a
    [size=1em]{% W% v7 f9 t6 \0 ]6 {/ H1 ^3 B
    [size=1em]public:
    8 I) e' l2 ?$ }; J$ m[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    ; c1 u( p  v! z+ @' H5 Q2 I* Z0 l( `[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    ' \0 u$ n5 f, z0 N! e[size=1em]}
    5 ]- ]) B  g& }! U
    3 ]! D% _& J" Z+ ]3 Q7 I- d  e[size=1em]class
    ! N- m; U. G" n& f[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
      Z, e5 t, s: n- @[size=1em]{" f5 O# e4 D7 T( \8 n0 c7 Y
    [size=1em]public:( v0 a% x; Q- q) U
    [size=1em]    virtual InterfaceU1* getInterface1()
    ( N% x+ ~* e1 P. }8 w8 k9 k( f[size=1em]    {
    # t9 G6 W0 W; x5 J4 i6 Z5 M- W. m% _[size=1em]        return this;4 Y9 k. N; `3 V
    [size=1em]    }
    ' G8 a( k8 Z' X" u* `2 n  u% w/ z[size=1em]    virtual InterfaceU2* getInterface2(): Z2 _! F; }; z# _+ V5 t. L
    [size=1em]    {
    7 l% x3 V. g/ X5 ^  {/ z4 A: W  e6 j% [( W
    [size=1em]        return this;/ @  L( `" d$ g+ n/ S* J2 e
    [size=1em]    }
    $ ?& A3 v1 m1 ]5 g[size=1em]    virtual void func1()
    1 b/ t3 P4 y9 C& A[size=1em]    {& `% z7 d2 L- b
    [size=1em]        printf("%s", "func1");
    - k: S: d3 T# J/ s; E! o# a[size=1em]    }
    2 K1 e2 T1 k( p( ^' g
    $ X% A3 g2 k& @# `' i: N; F[size=1em]    virtual void func2()" @; Z, ]+ B" r6 y2 Y' i0 @" N  G
    [size=1em]    {
    4 W& p3 J1 g# l' x[size=1em]        printf("%s", "func2");0 a) i  U# r% x- N/ U
    [size=1em]    }
    : V1 \3 g6 H' j2 o* u[size=1em]}. l4 X2 g% g7 d! o! \9 i
    2 x3 E* \( `' c, ?; C

    * _; i# i0 u; b( ~4 h4 V; u% \7 Y/ _

    - E# Z. q, M2 P0 k  }  m; y
    3 Z1 @# j! E  \. {$ e' G假设有如下代码:4 T, x: j% V9 M' i  m. x
    [backcolor=white !important][size=1em]PHP code
    2 o) H* l9 l% h, J$ w
    [color=white !important][size=1em]?
    ( o2 C& Z: k0 z( G5 A$ c/ r
    [size=1em]1

    * ]4 {" \: r2 l; u$ A: H- L
    [size=1em]2
    4 N) _2 k: n/ G! o
    [size=1em][size=1em]Base* pBase = new Base();9 i# g3 t: B( m& _8 ]$ D
    [size=1em]pBase->getInterface1()->func1();
    0 k( D1 M4 ?( i+ H' q" x# J4 ?, r9 e
    - k7 s; B  V1 v4 f  |

    + W6 N. A; ?% |- l; V. ?: F, x4 o& Y

    & x( m* B3 Y+ t+ z其实以上代码等于:' w" [9 U! {$ M! |7 r) f- c
    [backcolor=white !important][size=1em]PHP code! C6 I% T! e: Z% c
    [color=white !important][size=1em]?
    / g. L7 t& i( G
    [size=1em]1

    : o" E3 F( K4 d6 S3 R5 v" X
    [size=1em]2

    7 ]0 z7 |# n1 w0 H7 P0 y" C
    [size=1em]3
    : N  n! \& H3 I# V' Z3 O5 Q
    [size=1em][size=1em]Base* pBase = new Base();& _- b' X5 E) g* U* s
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();  y& l( F/ y7 B& k
    [size=1em]pInterface1->func1();+ O3 t" U; R2 Z, k
    9 @& ]+ [+ D+ W& ?* G: t: t
    & e' c3 m: Y- P+ V5 e: q3 r
    4 A/ N4 K2 \; \

    , |& G+ j: J2 V7 M8 {, Y% ?* a3 ]1 X! y7 `, u6 F2 s
    ( ]9 l! |; i+ j7 N
    C++编译后,Base类的虚函数表如下:7 M6 o6 }/ c1 F
    [backcolor=white !important][size=1em]PHP code
    , ^+ P& e" I# }
    [color=white !important][size=1em]?

    7 B+ w& }6 Q. T/ g
    [size=1em]1
    1 G6 b$ T- G2 b' T! |1 `
    [size=1em]2

    ) S. L7 I; f  M5 B+ ?$ s
    [size=1em]3
      M0 t, b4 }- I# Y. f" t
    [size=1em]4
    7 e9 F/ Y, u: n/ f+ |' i3 d
    [size=1em][size=1em]  
    + N4 u  X* B3 S" E0 q) k: k6 ][size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    0 M- k1 J$ Q2 {- X; r: ^+ k[size=1em]vTable:InterfaceU1 |Base::func1()|/ {! ^7 z$ v( M6 H/ \$ B
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    & X# j5 I+ e2 A5 W" z+ p$ q4 {0 v1 e$ V! ]

    * R. H" F  r* I( e7 i4 L9 J
    ' S8 P6 ]9 T  x. A
    4 i# c9 s& l3 D7 n: l( I& a1 @4 g( R' n$ r/ k0 G# ]
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。- [: L" ]  w6 L9 Q8 s, G% g% A+ Q
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。  q& `& A: w# Y$ W1 U; Y: h
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?! t3 V# K! p0 W: u, c
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    " e9 ^5 j5 X1 I- Y. u2 _; D& {" E! o& 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-9-24 20:17 , Processed in 0.541462 second(s), 54 queries .

    回顶部