QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2003|回复: 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
    + {& r! H! N, [3 _6 q6 H[size=1em]    InterfaceU1
    6 U& c+ M& w7 j4 {6 b2 O[size=1em]{
    ; T+ I- `! E" ]* `" H" @[size=1em]public:$ K! K2 e- I( E! d5 C
    [size=1em]    virtual void func1() = 0;
    7 A( F$ W5 D- G& s2 {( [* O- _[size=1em]}
    4 Q" B* \3 @7 {! T/ b5 G5 {' o: N/ V% X7 Q
    [size=1em]class' B) \  H2 ^8 Y4 H
    [size=1em]    InterfaceU29 U  ]: N9 M: J  Z6 H# x' n2 {
    [size=1em]{1 o/ a+ o; p! x" Q3 J: Q/ Q
    [size=1em]public:) x$ C2 J' s; B
    [size=1em]    virtual void func2() = 0;
    / t: _0 K$ G: m0 y[size=1em]}" v4 o& W7 u. Z
    5 _& \$ }1 h$ b) N
    [size=1em]class# a5 q, I7 n+ A/ Q7 N$ o
    [size=1em]    Wrapper* _( }. N; R: s, L, Z5 z
    [size=1em]{; H3 I3 u7 l+ ?5 T  ]/ A: w) ]
    [size=1em]public:
    1 c8 T' W: f4 R+ v) l5 l4 G' v[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    4 h$ e& A1 f4 \2 s[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    - x" [7 h9 z- ]0 z4 I4 N% J2 u3 J[size=1em]}# F' T1 e8 i$ H4 W2 i" K" B
    6 w6 H5 @  a+ o( U" ?
    [size=1em]class- I7 k0 p% F2 F! S' ?
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    + q1 A8 ~4 d; \5 e! Y2 ][size=1em]{' }! @# @* Q/ [* S
    [size=1em]public:
    1 N  n3 e2 s% T, |1 ^; O[size=1em]    virtual InterfaceU1* getInterface1()
    ' ]0 A+ E5 P( k( X[size=1em]    {( W1 [  V% G2 ]8 N& P
    [size=1em]        return this;
    1 [) Y  T# v# o6 l[size=1em]    }
    5 l+ c0 I+ Q; \[size=1em]    virtual InterfaceU2* getInterface2()
    ) K8 p% o% F: n[size=1em]    {
    " T; j# l# k5 M% q* d
    ( q! E6 ]' W" a8 W9 Y9 @[size=1em]        return this;. J+ k. {: @: V" O4 ^
    [size=1em]    }, a9 w) S) h: E! P
    [size=1em]    virtual void func1()2 l6 M& i- j: M) Z. Y$ y
    [size=1em]    {
    2 ^" T) J, l" a0 U[size=1em]        printf("%s", "func1");, X! v  T, \# m& Y4 H/ g; n
    [size=1em]    }
    7 f* W# [7 B2 w  w' [" ]- \( w0 J: O7 E. a, h7 y/ C
    [size=1em]    virtual void func2()8 O8 k6 |6 i+ P! A
    [size=1em]    {% Y% }% M+ W9 H" J1 u
    [size=1em]        printf("%s", "func2");# y! e9 Y$ W, W: |+ Y; ^
    [size=1em]    }4 D  B7 ^% n9 Q* l/ j$ u( k
    [size=1em]}+ c# R% c; c6 L8 \3 W9 u
    ( d3 {( p: a: O' h3 m

    ; ~( w- Z2 }# H$ }3 z" f

    % z' o8 v3 L7 p( E/ M/ F* N
    7 f( T5 M4 K' }* _假设有如下代码:
    6 x' z, R/ Z! l' h8 `+ f: z[backcolor=white !important][size=1em]PHP code2 c. }' k, m2 [" D
    [color=white !important][size=1em]?
    " {) t2 v& K1 C
    [size=1em]1

    4 T4 i6 _$ h& M. m* w
    [size=1em]2

    % K2 B5 F! U7 q/ R; i
    [size=1em][size=1em]Base* pBase = new Base();
    / ?+ T. A" e, V[size=1em]pBase->getInterface1()->func1();' l' Z1 g5 n2 ]7 y9 {! x

    ! @8 F& x: ]+ |0 ^- B9 H

    + T! S# C3 N8 O) @; {
      b! _3 ~) M" X5 h) [
    8 x* v' a1 b. c" V" h0 ]其实以上代码等于:9 t2 _! D8 O4 s* A, ]
    [backcolor=white !important][size=1em]PHP code
    ) `% H* d( i8 s9 R
    [color=white !important][size=1em]?
    # D$ i4 t8 ?$ d2 {
    [size=1em]1

    8 F7 N# z# \, q3 ~! d: H
    [size=1em]2

    8 C7 q/ K3 x* N, I8 ^3 h9 i9 W
    [size=1em]3

    ' t! [0 x' R7 ~7 `6 h/ P4 L7 ]! j- D* b
    [size=1em][size=1em]Base* pBase = new Base();
    , X! \; U  I3 X9 ]6 Y[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    9 L6 y) h! ]( O! D0 k9 p[size=1em]pInterface1->func1();, o- E' x3 N: C' e9 W! I% n$ k
    + O' [. N/ c, l' Q$ t) O
    , h5 L! C+ A+ V9 @- g- L

    : }9 x; [  V: S. i$ [6 }8 E1 x
    6 E+ W- d5 N8 {/ H# S5 Y$ y, y6 x. a/ s

    2 _8 a5 c+ c9 G! V/ @% ]C++编译后,Base类的虚函数表如下:
    . y9 D2 f" z7 Q' k2 g* w( Z[backcolor=white !important][size=1em]PHP code2 e4 Y7 F: }6 K8 P; E$ z% v
    [color=white !important][size=1em]?
    ; ?$ S' p0 R3 q1 {+ Y* ?0 y4 {# t
    [size=1em]1
    & E$ B* `6 M$ ]/ i- }6 o% L
    [size=1em]2
    + g3 Y! \/ p; Z
    [size=1em]3
    % w8 g9 ?9 K8 g4 ?8 n/ b
    [size=1em]4
    7 `6 J) |$ e  z( ^% c* \
    [size=1em][size=1em]  
    2 z1 W" z4 `$ _9 L[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    8 _9 v# Y. \3 `0 m1 k[size=1em]vTable:InterfaceU1 |Base::func1()|
    $ V7 K; _, J! P* b  P$ S# U[size=1em]vTable:InterfaceU2 |Base::func2()|
    ( I% t$ R' k- L" I  p9 A, B! t0 t3 s; f# g; C1 s6 }5 l
    + C6 t4 p$ c; F& _: N! m& z8 O
      \; L1 b8 E5 P* ]7 ]" m
    8 L- {$ t4 Y' e. J/ @3 j/ b
    % b: N+ _. Q- [. k, j* s& i6 Y7 b1 B
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    + p; O& m8 `. w4 s但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    2 p1 z. ~, k3 P" WC++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    * V+ Y: Y# Q3 uC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)" W1 G/ |) s+ V8 G

    0 ]8 w; i' ?9 v. J
    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-10 22:50 , Processed in 1.209007 second(s), 53 queries .

    回顶部