QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2015|回复: 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  t" j" r6 M, i& _  n2 [
    [size=1em]    InterfaceU1. z4 L- `; m4 `4 r/ ^
    [size=1em]{
    " n  v, K' H: V1 _# |( I. r6 [[size=1em]public:6 k: a: X1 `* i* \. r. l
    [size=1em]    virtual void func1() = 0;
    $ A9 U9 h% I3 {[size=1em]}+ h  M, d. ^3 x% E6 F/ F
    ( U! t: ^# f  Z, B* v
    [size=1em]class0 ?2 W, E; J: N: J6 Y" k
    [size=1em]    InterfaceU2. y0 ?, X5 e8 G" I. N
    [size=1em]{
    : ?$ z% {# b: z+ T# L8 b$ F[size=1em]public:5 H8 r1 ]' g9 D$ E
    [size=1em]    virtual void func2() = 0;6 n1 i: `2 e9 H. h2 ~
    [size=1em]}
    - O/ K& k5 Q) T. l3 w( z2 }1 @8 [, Z8 W; U
    [size=1em]class
    5 a, u# X1 m5 D8 U[size=1em]    Wrapper8 j+ s0 A3 _, U" C
    [size=1em]{
    1 w2 P" z( @' J; y. V: R9 _[size=1em]public:
    & f. K) m7 X* Z+ c3 i[size=1em]    virtual InterfaceU1* getInterface1() = 0;
      M. e" ]8 r& G& I9 e& x[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    ' {3 {. y7 b8 k* K7 s5 J) R[size=1em]}' H& M: \9 d! {' @3 [

    . |' a* Z2 ^7 G) U' g) P1 L& ~# e) K[size=1em]class
    8 t7 B' s# y, g# \: B4 y9 J[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    3 ^. s/ {, r+ ^% V0 K) Y[size=1em]{
    - d* U* G0 e% @, F9 W3 k' j[size=1em]public:" p: w: m9 E- }. g
    [size=1em]    virtual InterfaceU1* getInterface1()$ y7 @* q3 [" s% x+ e4 P1 k5 u  |
    [size=1em]    {
    : {. \/ d# B, G% r3 g9 ^[size=1em]        return this;9 e& [, }% z6 V/ r4 \/ X2 R2 V0 }/ c
    [size=1em]    }
    ' b' N1 Y9 P' ?8 g" _7 W" {2 i3 F[size=1em]    virtual InterfaceU2* getInterface2()- \0 @. J* L3 E$ h6 s' Z
    [size=1em]    {
    : Z6 L; X4 P4 k7 c3 i+ G9 [# [. d* z3 R) m7 C' ?' Y$ R$ ?5 ~
    [size=1em]        return this;# n5 J0 g7 ?' o" s! R4 i& I7 `
    [size=1em]    }
    0 _5 F" D% F* k[size=1em]    virtual void func1()
    , g, [+ \6 p. W) p, C[size=1em]    {
    & B9 D. H" W; |. h3 i' i[size=1em]        printf("%s", "func1");
    0 w" w( E/ ^2 j2 A, F$ G[size=1em]    }
    $ ^* y$ m6 x6 E& s
    + C* E. V% x9 d0 t; B[size=1em]    virtual void func2()/ Y. ^2 C3 K! K
    [size=1em]    {
    , x) b9 a) w) ^" a" b[size=1em]        printf("%s", "func2");6 Z. g- l% B8 R+ y9 `5 }
    [size=1em]    }- H# |, }  C2 b1 v& E) Q' X
    [size=1em]}# z$ m1 E  U: I
    ( y0 g5 t" p9 l, B( C
    ! f: k; k9 J6 v! D1 t
    8 I+ K+ r) u& t: b7 H- F
    " y. Q. j" ~$ B
    假设有如下代码:
    5 E# x0 q$ S* `- `- D[backcolor=white !important][size=1em]PHP code
    % ]. b4 ]* @  |0 i$ Q, j' V; J  ?; [
    [color=white !important][size=1em]?

    ; N) `$ g& ]) ?( E
    [size=1em]1

    & A1 D# G: p9 ^2 v; n- _6 g; G
    [size=1em]2
    3 `1 M* y5 R/ P
    [size=1em][size=1em]Base* pBase = new Base();
    & o+ K8 q+ G" y; ?5 b- h[size=1em]pBase->getInterface1()->func1();+ `$ f) W- Y6 \+ H* w( {: S" N3 N
    ) h! j/ w0 b$ y1 l: k- D' S

    ) M! U2 ?* u, K0 N4 K! e  n& c: d: `: G& o, z6 A$ b- B( b
    * N0 h% Q! v" T
    其实以上代码等于:
    * l! S; X. x; F2 ?[backcolor=white !important][size=1em]PHP code* d4 e* O, n4 z7 V
    [color=white !important][size=1em]?
    / R" J/ \! q' R
    [size=1em]1

    + T* y# X1 a8 J
    [size=1em]2
    ; R; R' n" ^" b* M. Z4 q
    [size=1em]3
    : V1 Q, L: v" |1 @$ k
    [size=1em][size=1em]Base* pBase = new Base();6 g: ?; c6 W( Q/ t7 B9 d
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    ( F* S7 P4 [% p5 q" p[size=1em]pInterface1->func1();/ u: ?: B2 u; p# Q* F% K
    / \6 Y9 P) P; k& S

    1 O3 h! D1 F7 \5 h
    2 M6 I) ]! |) `9 F$ N! ?4 i2 w0 f: N% d% R) n2 L) L

    & ], R1 d9 Y0 ^1 V# @
    / c/ f2 \* q) W' @' A& mC++编译后,Base类的虚函数表如下:6 ~# |! _' {1 y( l5 G8 W' {
    [backcolor=white !important][size=1em]PHP code
    $ ?# t( V( u, N: _
    [color=white !important][size=1em]?

    5 O7 g( X6 p% R8 k! U
    [size=1em]1
    * C( [5 Y4 P& v. X* z6 ?
    [size=1em]2
    1 c4 H. M. ?  e$ y7 ^: G
    [size=1em]3
    ' _# j) Y3 m' h! }9 T( }
    [size=1em]4
    : }, }; v7 F* b7 A1 n0 L% \  l
    [size=1em][size=1em]  + V% I: g; ~4 `7 b' R
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|2 C) ]; S4 X, s( }% J3 }
    [size=1em]vTable:InterfaceU1 |Base::func1()|& \+ x4 G2 H5 y0 M# w* t
    [size=1em]vTable:InterfaceU2 |Base::func2()|& _* m4 B7 }) l8 V' x( k
    1 P5 p1 G. w5 o( N
    % D0 i1 Y# p  Y, Y; O

    $ a; H( v! C# B1 u8 L6 ^
    # i) y, w8 e& t, T8 ?  ^
    : E, \( i$ ]' p" J6 {, F, p8 c如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    ( i8 G5 ~: D5 N7 Y但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。5 l' I( _; e. O7 ^
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?' N  {5 }  C1 E  j/ Z, p
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    5 A5 H2 \1 n8 \5 }: C5 Q
    , v: e3 I, E& T) T" t  e
    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-17 01:36 , Processed in 0.373658 second(s), 54 queries .

    回顶部