QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2009|回复: 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]class4 H, G% j2 @4 L7 K2 x, J2 m
    [size=1em]    InterfaceU1
    + z( C# k8 w8 ^% m[size=1em]{
    " k# R& e  y$ S+ I7 y/ I" k[size=1em]public:- J" r- p) r% ]1 p, c
    [size=1em]    virtual void func1() = 0;/ M' V- a( v  `5 q) x. T
    [size=1em]}
    : a% `8 {6 }$ B1 z( h1 g0 k5 b; a4 n8 D( G
    [size=1em]class
    # E. D( V& B0 t# \; k[size=1em]    InterfaceU2
    ( G( D) @, `: [0 m$ V0 p8 X[size=1em]{
    ' |- q. g+ W7 O- x[size=1em]public:
    : i8 C. W, R0 x. {% ]. H[size=1em]    virtual void func2() = 0;8 s  J7 Z( j/ Q# i0 D! s# R; h
    [size=1em]}
    2 d* F- z. h. l) T( J" n5 m' o0 Z8 D( U
    [size=1em]class
    * ]& ]( J! z5 @! p* F6 _" m[size=1em]    Wrapper3 N2 c6 k; o' u; B8 u
    [size=1em]{
    2 Z/ a. f& U1 E7 i$ M1 F[size=1em]public:+ Y% P* @$ n. q8 Z
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;0 ~' C/ d- q5 s0 u) M* I1 p
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;) }) g7 J( ?7 I+ y- N% r
    [size=1em]}
    ; v6 `" \6 A  B+ c# `% q: d; Z9 L& f1 ]+ W& G
    [size=1em]class: H& f3 J. b' g# E2 Q8 }* j" M
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    # K7 l9 s$ T( `! l  x) F( h[size=1em]{
    * w( v$ Z* M, r1 m5 H[size=1em]public:
    0 V. v8 X$ p! k1 T[size=1em]    virtual InterfaceU1* getInterface1()
    , k) z' w- ^) t' D5 \; c# f2 a) Z; J[size=1em]    {2 [# L& H2 l6 D
    [size=1em]        return this;9 H$ h/ o7 a9 l  o$ z" @9 ^
    [size=1em]    }1 v( [( U, m6 k$ m: i) [+ g
    [size=1em]    virtual InterfaceU2* getInterface2()
    ) `, u# t$ x: C[size=1em]    {
    5 g) m; j7 A( S! k( P; ~, T: R8 P) r' B" ^, }/ T
    [size=1em]        return this;2 E: c3 \3 X, A! |- }
    [size=1em]    }: u1 ^; i1 h' J3 {- {+ f4 l
    [size=1em]    virtual void func1()2 u/ V3 d* x: `) Y$ p) r# O
    [size=1em]    {+ n2 ]0 c0 I. \6 `  F: m1 P/ _
    [size=1em]        printf("%s", "func1");, g5 C/ R, o% O3 z( |1 [1 r3 l
    [size=1em]    }; j) C- `! `# k4 P' f1 x

    7 F3 d! G; t& d# \2 V/ v4 }7 H[size=1em]    virtual void func2()
    * x- i5 K& @! x! S+ Y. t[size=1em]    {0 j5 \/ Q, t( T% E/ b
    [size=1em]        printf("%s", "func2");# V0 ?( Z7 G2 L- |! Q
    [size=1em]    }2 m; o! R9 i3 Y8 D) D  {8 V/ @
    [size=1em]}. D) X+ R7 _2 d0 b# d, {' D9 p) w
    4 c/ k' k4 I, E9 Q
    7 o! d4 {7 E) e+ H8 b; r
    . u$ _+ O; U6 V* B2 I+ D

    . s8 q* X8 m* N6 p假设有如下代码:
    " E9 r1 b8 H. I; M. A4 X6 u[backcolor=white !important][size=1em]PHP code) Y, P9 V+ Q, ^2 G" C
    [color=white !important][size=1em]?

    % ?6 I' \! k1 c
    [size=1em]1
    4 a: d2 _) ^/ V" `; a6 E0 n
    [size=1em]2
    ) b! q1 i3 G2 m( P6 l5 {+ N* g
    [size=1em][size=1em]Base* pBase = new Base();
    7 ], c; S% J# ?- ?3 F[size=1em]pBase->getInterface1()->func1();
    6 B+ c/ V/ t* [- _7 E+ h1 Z; ?8 t9 `+ ^$ `; h: x" i
    $ D- p# n9 t7 `4 J

    # \* [, J% t# ]; T+ C( j: d0 ^0 e! d8 D) B) X
    其实以上代码等于:9 y5 `: y2 z" c3 a
    [backcolor=white !important][size=1em]PHP code6 X( R9 h3 G( t6 }% g
    [color=white !important][size=1em]?

    & D9 z  P- b' l& Y
    [size=1em]1

    + x$ E6 k% s! }
    [size=1em]2
    ! h- b; f' q& {% i8 g( ]3 J1 D' ?  |, K* }
    [size=1em]3

    . X% W7 p$ h* ?( b6 }: V( Y
    [size=1em][size=1em]Base* pBase = new Base();
    6 j; f" v) Z$ _$ |4 ][size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();% g. \. q- z. D& t
    [size=1em]pInterface1->func1();6 |, M$ E# Z0 y& f, o
    & s% a9 e- h( Q% Y$ N

    1 r$ v, L' E$ e( \% k4 c1 ~. z0 b  B7 C1 G4 b
    4 b0 S3 w0 R* }8 U: \

    % Y% v7 [& M0 [( M% @0 _; ]: x
    4 H" D: t' V6 v) ^; B) K1 L$ mC++编译后,Base类的虚函数表如下:; d& B7 ~* J- u) G
    [backcolor=white !important][size=1em]PHP code
    & g. z5 `" P9 U
    [color=white !important][size=1em]?

    7 j4 D. {0 O" j5 g: j/ R
    [size=1em]1
    " r! O  j( f' T
    [size=1em]2
    2 @: H7 ~3 Z& n3 {  k8 s; G
    [size=1em]3
    4 [+ |& i  R2 f1 M9 {4 ~
    [size=1em]4
    9 k) U6 ]4 t" s6 i% @
    [size=1em][size=1em]  $ P$ v( G* I6 [
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    ! ~0 }$ G) z3 @% F+ d[size=1em]vTable:InterfaceU1 |Base::func1()|& q) {, o: j, L' b( V9 ^* c
    [size=1em]vTable:InterfaceU2 |Base::func2()|% b! T7 p1 g6 t# ?
    / q/ Q' k* E) I/ M/ }. ]: D, g

    ) F9 z* C$ ~; U
    0 [6 w' h( P. p: c9 D, v1 R* g3 j
    1 N) ^2 V5 n+ U% `& A
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。8 W8 }+ h6 g! n2 F
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    / c7 @1 g; j2 W3 N' x5 sC++是如何得到当前应该使用vptr[??]位置的函数地址呢?- h7 S9 L8 T) q3 z; @6 j' m, M
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)% @8 k% o6 }; n  o( o6 c$ l

    0 E; Y3 t& B* H  k4 |  d1 w; _; |1 V
    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-12 21:31 , Processed in 0.416070 second(s), 54 queries .

    回顶部