QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1815|回复: 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
    " m! i: C7 A) [[size=1em]    InterfaceU1
    0 q9 h$ V& m. k1 T" x, P& u[size=1em]{0 z2 ^2 {4 I" N
    [size=1em]public:
    $ ~7 Y( w5 l* h8 N. c) [" p9 _[size=1em]    virtual void func1() = 0;, e, m2 N" x- u2 x0 f$ E$ V, R  g0 }4 ]- I
    [size=1em]}
    9 h5 v9 J, H8 z  J# N& [! H* ^( p, L0 g. b
    [size=1em]class
    : K0 Z. N# }2 X+ Z[size=1em]    InterfaceU2
    7 A8 y9 Z3 h+ Q[size=1em]{
    - p' l/ F4 a" y' r) W[size=1em]public:
    % c" s3 Z7 ]7 x0 r! F" \  C5 U; X[size=1em]    virtual void func2() = 0;
    2 }. N# b' H0 `0 R# A- N[size=1em]}
    2 V7 W4 F9 m) h! {) `" N% K. N6 k. x7 @& k2 }' F: g; Y
    [size=1em]class* b' }5 ~7 K  Z( b  I/ K" q
    [size=1em]    Wrapper
    * ^/ o. A% {7 ^' Z[size=1em]{: ^1 l  q' ?8 a" P9 s) X6 [* h
    [size=1em]public:$ d2 T$ u3 j9 q; X( o2 M
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;
    6 d" l' k1 Y# i& o: G5 _- q[size=1em]    virtual InterfaceU2* getInterface2() = 0;( g; L7 f) S! a; Y7 {5 r
    [size=1em]}
    , x' R% O1 X4 W* }. N" h
    ( A5 c3 y6 e4 |8 K+ @% m9 b- t$ j) m[size=1em]class
    & M- g/ }$ I. L1 o3 @( d# h% U* ~[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    : C' d8 k* [, O8 {3 ^# N. G! D[size=1em]{6 p) k/ t/ q! y: b
    [size=1em]public:4 a. a5 b9 u* u. }
    [size=1em]    virtual InterfaceU1* getInterface1()9 ^6 E( h4 R6 h  }$ d* ?
    [size=1em]    {
    2 h+ Y8 n) I4 t# c[size=1em]        return this;
    - B- s' N5 ^2 H' ?- I1 ?! c, o[size=1em]    }! X: e, C0 S* \* a# F' R5 _
    [size=1em]    virtual InterfaceU2* getInterface2()
    3 \* n; \+ R, ]" S" Q$ p[size=1em]    {2 i) S9 Z/ ^  g7 o

    " i6 s) N/ ^1 ]1 z8 n5 s[size=1em]        return this;+ J/ j* u9 V- b, Q0 R% H5 i
    [size=1em]    }5 ]0 \& ^& j$ _0 l! Z
    [size=1em]    virtual void func1()
    - h8 j" X# h) ]0 f% V6 F. z  o[size=1em]    {* |& \/ t) ]) ?, m! ^5 E0 x: `
    [size=1em]        printf("%s", "func1");
    1 ]0 k+ _1 [: i* ]$ M$ x0 b[size=1em]    }
    , e4 |+ r- `# g# r) s6 W+ v$ `' u/ o( f5 Q# f
    [size=1em]    virtual void func2()0 A, B- d; \: D$ h, B: B
    [size=1em]    {
    3 [( m6 }3 f* f% I4 E9 s[size=1em]        printf("%s", "func2");
    " T0 `8 U3 }- s9 _[size=1em]    }* M, R6 \5 d0 V( P
    [size=1em]}
    * q- m7 t7 D  H) G2 F6 L
    2 ?0 `1 H5 D( m; Q' `
    3 i- S8 N3 ~$ N+ b" E+ t1 p1 R
    " Z" s. c5 V5 G, T# E; V- ]7 X

    % e$ p5 M  I  M) E8 O假设有如下代码:: }7 `4 T$ i: A* f# |
    [backcolor=white !important][size=1em]PHP code
    . j/ S$ F8 f2 A5 J
    [color=white !important][size=1em]?
    & g! Q5 F/ V( @
    [size=1em]1

    $ V- L3 r/ q" e* _! \" S" F& w/ V* l" B
    [size=1em]2

    8 z% i3 [4 x' E
    [size=1em][size=1em]Base* pBase = new Base();
    , f6 b0 I( I9 G7 u[size=1em]pBase->getInterface1()->func1();
    * E9 L  E3 {; \- F1 [' R4 O
    . e; O& h+ f& u8 R3 {0 L$ Y$ {
    + X9 e  f( z' Y# ~* q
    " Z3 d: l2 y. ?$ f

    * ]# ?$ D% j9 B+ a1 y其实以上代码等于:. t2 g, U  y7 I# I- u
    [backcolor=white !important][size=1em]PHP code$ C9 n2 I4 ]1 J: R( ]
    [color=white !important][size=1em]?

    , h8 o# ~% }$ C9 ?, L
    [size=1em]1

    ) f- ~) ]# M  C" X1 g  X
    [size=1em]2

    - F) \5 S# e% m
    [size=1em]3
    ! k& a* G( H& y$ N3 k) {$ j& K
    [size=1em][size=1em]Base* pBase = new Base();
    7 W4 [( t( b. N6 k[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();: w# L& V7 z; f
    [size=1em]pInterface1->func1();8 W  U  z6 @" h% E8 E5 i, {

    1 P- L+ u2 }  l) e$ [3 F0 I
    ( ~. d" b- f% Z0 l
    $ E: O6 q" G& k. U- r% }1 f, ~" i/ D1 l
    5 Y1 b' Y8 e+ P  y8 c& ^+ h4 r' S

    ( L; t& G( w3 f# }) T" g
    : ?3 `' l8 x, E  w2 j5 GC++编译后,Base类的虚函数表如下:
    - B$ r9 d' R! h3 H( e[backcolor=white !important][size=1em]PHP code. ?' A9 `( r5 r4 \. R
    [color=white !important][size=1em]?

    5 z. K" n( o+ S9 ]3 ^! w  `1 _5 P
    [size=1em]1

    ' C2 ?3 R/ ^* o) z
    [size=1em]2

    0 i  N! I7 @5 \$ R% M+ r- q
    [size=1em]3

    3 z# t: D, k. {4 _3 I+ _
    [size=1em]4
    : k7 ^/ l) A8 }* ]' C) C5 O
    [size=1em][size=1em]  2 {! M9 L4 ^6 p& Z" M; D: \* L- U
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|4 b  N3 l; e  z# g
    [size=1em]vTable:InterfaceU1 |Base::func1()|! B* W+ `5 `( F+ O" X
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    + X% \' ]- W- A0 [# O/ I% }: H, N6 R: K9 C2 x+ v" _# P- U

    $ D; i- T! z" @6 O( e* v- r
    - ]/ J; O/ O' {: z$ }5 ~$ h1 F! V4 X* ^( @$ L$ B
    . W, O6 ~/ e* \5 h. c% i- ~
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。+ l4 A2 ^! b/ o0 B7 a# ~5 s2 P) k  `" i
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    ) R! {7 n5 T/ \  x1 R% R* lC++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    " w0 e! w3 s4 O* jC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    # g: d  `5 v4 G+ l: R9 @+ Y1 ~, Q
    % w  O3 W4 C- w+ p8 P9 @& \: 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, 2025-10-13 11:45 , Processed in 0.422560 second(s), 53 queries .

    回顶部