QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1575|回复: 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
    . \+ K, T  c' R$ Z' R4 i, d[size=1em]    InterfaceU1. K' S- V2 O( ^  P1 N
    [size=1em]{
    $ q6 B0 V2 B% b  J; u1 ^[size=1em]public:
    0 M" @- E& k& t2 n( C: X. L[size=1em]    virtual void func1() = 0;! |* G7 \1 _" L" U7 M' S3 C2 v
    [size=1em]}7 q' o" S! z  o+ u4 @5 b
    ( f; H( P8 ?$ l( a1 z8 Z
    [size=1em]class
    ! a- T- _4 Y) U3 ~[size=1em]    InterfaceU2
    8 |3 x; w" A# o[size=1em]{3 j% Z% u/ y! o) r
    [size=1em]public:5 j- C1 O) i0 |  Q( m8 u* w
    [size=1em]    virtual void func2() = 0;. V, T& m8 C( O9 p& u( _
    [size=1em]}
    3 b1 E; g; n3 e. h% S& X& C. S3 w/ O. l
    [size=1em]class
    9 H' `3 t' f- c$ B1 R* \* G6 P[size=1em]    Wrapper
    , _5 c0 G' C$ \! ^" @& N0 F* o[size=1em]{
    - [8 l  B2 `  |. X9 [% b8 `[size=1em]public:
    - i4 O6 |5 _* A9 T[size=1em]    virtual InterfaceU1* getInterface1() = 0;2 y/ q3 H* d1 o! x, ~
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;
      X* \- o7 ?  a7 ][size=1em]}  B) w6 \& S+ R0 n' Z

    3 }: `1 d$ L. W# g# b[size=1em]class
    & g2 t# c7 z: z) k- U[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU27 M) F2 A+ z4 i4 S/ b
    [size=1em]{: X! J3 q* ?0 R
    [size=1em]public:
    / x2 d7 `. x, }/ M( q; s+ @* h5 P[size=1em]    virtual InterfaceU1* getInterface1()
    : @( d; L. @1 ~) Y+ A( e  K; N- v[size=1em]    {
    0 x% N7 m1 h* y, X. h[size=1em]        return this;
    ' C3 e9 f5 e" I1 J3 v1 V[size=1em]    }
    5 n1 a! G5 L5 u' U( \[size=1em]    virtual InterfaceU2* getInterface2()+ M- R3 p' o9 e1 p
    [size=1em]    {
    : X/ T2 J. R3 Q" F+ d$ A
    0 l. s! D* s9 ]  a5 `# h& m  S[size=1em]        return this;
    ) B5 k9 I8 J+ Q" K# Q- I[size=1em]    }  [* ^! Y; ~0 r7 f( D- M. R9 x
    [size=1em]    virtual void func1()+ `3 s: D6 O1 H& T0 q, S. B
    [size=1em]    {8 ^6 j* m) B" C0 \  P0 |- u
    [size=1em]        printf("%s", "func1");# d$ z6 ]; K$ a1 U' F* r
    [size=1em]    }
    2 B* X. s2 u' D0 c  V, ?, S2 K$ r- V/ o8 |- W! |) l+ {
    [size=1em]    virtual void func2()
    ) L! x5 Z" v. }" @- C' q[size=1em]    {' s/ y% X# ^$ K0 I$ L0 z% h3 C
    [size=1em]        printf("%s", "func2");
    - a( F8 }5 y. c[size=1em]    }
    / h' x) W& W4 Z[size=1em]}4 y' N& U5 F- z) n- ]5 G
    4 J6 Y$ ?. K4 G2 t  p
    - v& |+ f9 Y: T( V- K

    ( u- ~9 W2 j+ c7 _5 u$ K, ]9 j
      J8 O. p1 E/ `; V: i假设有如下代码:
    " q# `5 g7 ]9 V[backcolor=white !important][size=1em]PHP code
    * X# X4 ?4 e5 U' ?( j  C: O
    [color=white !important][size=1em]?

    % E4 T3 L; ~; Q9 U. g. Z$ m9 U5 U
    [size=1em]1
    ( A/ |: M: P1 M; l2 ^
    [size=1em]2
    6 n. p; t: j' n- e. |! x. e
    [size=1em][size=1em]Base* pBase = new Base();7 _% x6 J  y5 a# Y
    [size=1em]pBase->getInterface1()->func1();; @8 `  J/ }0 w% o; }/ T
    ! ~& A) M" a) c/ p7 {$ @
    ! a, l+ a  q; L6 ~2 h9 g# g, h' {

    5 }+ B' ]( r- }! ~5 G5 v% A6 X& Z& f8 |& @. ^$ V0 B# ]3 |
    其实以上代码等于:
    # A. A/ u& B1 U% y  y) D[backcolor=white !important][size=1em]PHP code
    3 ~. |1 D6 K. ~8 ~) `
    [color=white !important][size=1em]?

    0 ~. Z! D0 m# L& f
    [size=1em]1
    0 @# t8 _( K6 F& H1 p; Y# D+ h
    [size=1em]2

      @. I0 ~. ?0 u+ D# Y1 U
    [size=1em]3

    % p! V" m, E$ L& y/ \5 T( r$ {& o2 o& J
    [size=1em][size=1em]Base* pBase = new Base();& I" K1 U6 r" c- x
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();. _/ B3 j7 Q3 L- R9 i( f% C6 ]
    [size=1em]pInterface1->func1();3 N8 |- p9 u  U/ V* B5 x  P5 ~4 M( Y
    , n. _6 K2 B* ~3 F# a. l. i! Q
    / q9 f7 Q( T4 |8 x6 [

      u0 R( T: f& ^. n1 j' c
    6 P6 `4 j6 Q6 P) C5 ?# x# [" J4 G+ I) Q$ [+ K$ s

    ' ^' U, ~0 O/ M8 \* ^C++编译后,Base类的虚函数表如下:& t5 w" G8 F/ j  H, m# O! O/ d5 l
    [backcolor=white !important][size=1em]PHP code
    8 Y: E6 a0 Y* R; z
    [color=white !important][size=1em]?

    + [- Q% O' q+ H+ M
    [size=1em]1
    7 m$ q) k' e1 [6 C
    [size=1em]2
    - K: i4 I& ?0 r* V: z
    [size=1em]3

    - q; Y( z9 c+ P" Q2 k
    [size=1em]4
    ( N+ D, n6 G3 P* k
    [size=1em][size=1em]  - s8 E5 @8 q- I
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    0 ^  t- M' a8 s4 k[size=1em]vTable:InterfaceU1 |Base::func1()|" M$ n# t- t+ j7 q3 Y
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    ! l! H% e7 b) {$ h9 Q6 S  @0 t( w8 s
    % G5 _/ q/ J- S+ Y- H! }
    : ^4 [8 Y8 n6 |/ y  ], k: d. b

    ) o% ?* o, G3 g+ ?9 B
    4 W# E. _" C# |0 p9 {3 f# k; B
    3 `# E4 @$ c( a, J5 |如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。) p* p7 l3 m5 L0 f9 @
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    2 K, z9 i$ P/ }/ C" L  t) fC++是如何得到当前应该使用vptr[??]位置的函数地址呢?4 L1 J, E, t& [( \+ N1 q; v
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
      s+ M; ?! f, A4 E
    ' v3 v' s/ @. T/ 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, 2025-6-20 08:57 , Processed in 0.426959 second(s), 54 queries .

    回顶部