QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2052|回复: 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
    5 L6 S% y/ K& U$ D) a" `; G[size=1em]    InterfaceU17 V' e7 y# V& }
    [size=1em]{, M% m' O* {/ W+ K/ h8 r
    [size=1em]public:
    " I6 \, N% Y5 K: v+ Y[size=1em]    virtual void func1() = 0;  m2 c: T7 _1 [7 W
    [size=1em]}
    ' b( Y9 o5 V: Z" G$ X* ~
    # y  D" l( u7 ]+ e[size=1em]class
    ! E' \  ^: S! T# T* n  E; l0 o" s+ o[size=1em]    InterfaceU2
    7 |1 }* W% D6 a: ?[size=1em]{1 i  Q8 V3 t! h3 O2 g# t  o
    [size=1em]public:
    # d# F  b7 o- T8 w[size=1em]    virtual void func2() = 0;
    ( U7 v9 {* r1 m# X2 L7 a! z, V[size=1em]}
      S% V7 q% }* E9 x1 }
    ) A9 k* l" V" G4 s: C& w[size=1em]class
    4 o+ ]' ~$ @1 ~[size=1em]    Wrapper
    8 z$ |8 {3 w3 v' M+ u  r[size=1em]{
    7 H  G/ b7 u: S' E8 d( ~6 ^[size=1em]public:
    # W: |% k: E2 }5 E2 ?/ {1 p[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    + u1 O  u% a1 f; d0 w2 U4 K[size=1em]    virtual InterfaceU2* getInterface2() = 0;" _/ o! l" |  [, G* t
    [size=1em]}; ?5 _7 W4 R. K7 q& f+ p) Q
      _- C6 |7 b6 r  q4 e& M5 F( @! T
    [size=1em]class- o% s* e' b! m) q, u/ I
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2" l2 d& q3 @) D' d+ i
    [size=1em]{6 s- T+ d2 p- |3 [. b# c( v1 H
    [size=1em]public:
    - t' ?$ x- [& l* \% S8 t# ^[size=1em]    virtual InterfaceU1* getInterface1()
    7 {% U9 A$ B! C2 Q+ M( L1 G  J[size=1em]    {
    $ F; y- V: e( ?3 T" `3 U5 [; h[size=1em]        return this;# }" N% y* q4 r: {4 b
    [size=1em]    }
    ( V& z6 G! N: h" V" t[size=1em]    virtual InterfaceU2* getInterface2()
    % u1 g- M# |7 I5 L" {2 C  \[size=1em]    {0 T+ ~. c2 A1 u! M5 H) v: y+ h( e! D

    $ L( M) [3 ]& u6 m  I, }+ n[size=1em]        return this;. M* ?% a% _- w6 R3 k" c/ U0 W
    [size=1em]    }
    8 g* a- M# m5 h[size=1em]    virtual void func1(); I# [7 Q$ L9 g
    [size=1em]    {
    0 L; P6 ~/ U$ l[size=1em]        printf("%s", "func1");
    9 c. m, N$ r( i1 C[size=1em]    }
    ; H' s) Q; H; W2 @9 [& P7 E. P, E& N2 w' X
    [size=1em]    virtual void func2()- @; {$ n% i) v  A  J9 u9 f
    [size=1em]    {# Z8 W0 E- E) L
    [size=1em]        printf("%s", "func2");
    / f& @, f" F% L& P( d) x/ L[size=1em]    }
    % `4 l& q- g4 M* i2 Z9 Q[size=1em]}  C$ S& y5 h4 n1 o& R

    * ^) j9 g6 a- O7 C  Y0 R

    ) n  t+ O/ W# ~# ?4 t
    5 v7 S, {& Z( ^% B, v

    6 i0 f' Q% g$ \  k假设有如下代码:( P( V0 T, k. H7 d, s/ y# f, Y
    [backcolor=white !important][size=1em]PHP code
    5 a6 |  N4 ^: d& x
    [color=white !important][size=1em]?
    + w# i4 p" y# j6 }
    [size=1em]1
    / y" F! i( Z% {/ A9 z& y3 |" L
    [size=1em]2

    7 e- W8 q+ C1 [  d  S) ]  J
    [size=1em][size=1em]Base* pBase = new Base();$ J5 e8 T& ?: a
    [size=1em]pBase->getInterface1()->func1();
    + E/ Z! e7 [7 q0 A( \8 i, {2 |' x
    5 n" H/ H5 V5 Z7 ^* S) f
    / ?9 E3 O/ Y* C. W- x* r
    ; w( y+ ?6 J0 F
    , M9 b9 v4 ?! v! J, l! J6 I
    其实以上代码等于:+ `8 [" s$ G- q
    [backcolor=white !important][size=1em]PHP code! W( T8 {. e; J
    [color=white !important][size=1em]?

    ! e% q& \; e( e# F. j6 v8 o; w
    [size=1em]1

    4 M0 A/ [" z( ?- u' F
    [size=1em]2

    9 z7 h( Y6 z% O& U$ `% a
    [size=1em]3
    ; N( X! c- p, q, @8 K1 U( N
    [size=1em][size=1em]Base* pBase = new Base();( E% ]) {: Y3 |
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();+ [0 o8 W* p: a7 S+ ?, U
    [size=1em]pInterface1->func1();/ s7 x. v3 [- ~+ ~3 n% H

    ! X  I1 V  o6 F2 |$ ~
    + v, B- d$ R# \+ Q8 W9 x" u) D; L

      n* Z, g, ]/ G3 Z$ ]9 h/ s. `. ~6 L1 l* \, E! z- r
    ; g% L  z5 Q3 W) e5 I' ~
    $ S/ H) N' }, C" p0 I& @$ ^! g
    C++编译后,Base类的虚函数表如下:
    2 k$ u( E: X% M0 S( w[backcolor=white !important][size=1em]PHP code3 S3 Z3 X* |7 F' g& y8 r+ a
    [color=white !important][size=1em]?
    % A: m) _+ W  {  j
    [size=1em]1
    - t( U! o5 ^* n0 h  ]* s
    [size=1em]2
    + H8 X" r: G3 X) [
    [size=1em]3
    9 P/ Z# ^0 H/ R. L5 R% J# v8 H  j  H; R0 @
    [size=1em]4

    ( r3 {5 [5 K( e3 U2 ?7 {! w
    [size=1em][size=1em]  
    4 a% y4 ^/ a- ]" {: z. i  g0 C  Q[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|) `. N1 d( B: r2 h; L2 u
    [size=1em]vTable:InterfaceU1 |Base::func1()|  \4 H( V8 m" j" e: K: I
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    ; B; U5 s+ J5 k  t& d
    - I  A; F* N- I

    % |3 {. Q5 F7 N# I, l9 S/ z
    ) R$ i  k% m1 {5 \  C4 V
    & x% c" k4 i7 V7 [" d+ [- b+ @& [3 L5 Z' o2 ?" d  g" H
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    ; W- L: n% O. k但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
      d5 r: v7 X; w' IC++是如何得到当前应该使用vptr[??]位置的函数地址呢?1 s7 I& X, G! t+ p
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)4 E8 `& r! m2 R. E' ]( }) k' u9 P  Y
    9 X+ k9 g1 c- M1 K5 G' p
    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-7-13 18:48 , Processed in 0.700869 second(s), 51 queries .

    回顶部