QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2083|回复: 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 x4 ]) Z& K) `2 R0 w[size=1em]    InterfaceU1
    : K) L: h. j% B) r1 Y[size=1em]{
    5 O: t- ^* E; @; k6 [) }( D[size=1em]public:
    " i6 S% j) _! @4 F[size=1em]    virtual void func1() = 0;/ M# C2 O, h3 b0 _8 w9 ~
    [size=1em]}5 l: |( t' O; p# K& _6 k4 I
    0 Z* o% F  n9 e( b: f8 d
    [size=1em]class
    , U- o+ G3 z% _& d9 r6 g! G3 c[size=1em]    InterfaceU2
    7 h% t+ k. e2 L$ U9 R" ~) B[size=1em]{
    # ]5 p; B7 T5 {# q[size=1em]public:
    ! P  a( Q' \! f2 ]+ ]* i$ Q[size=1em]    virtual void func2() = 0;1 Y& [; ?1 R7 x! F# V
    [size=1em]}
    * [: J/ B! V: [' C1 _+ n" O* U8 a( ~4 `3 p+ `8 \1 m2 ?3 L0 [9 [
    [size=1em]class! m  v5 j* T! D- B; ^
    [size=1em]    Wrapper) B. g0 p6 r$ g2 o# c: A
    [size=1em]{3 C8 g1 z8 |8 F+ O* W7 a' Y6 J: ?0 k
    [size=1em]public:
    , y' Y6 ?0 X0 a2 l$ M5 y: s[size=1em]    virtual InterfaceU1* getInterface1() = 0;8 z% s) C) H7 i' o
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;3 o, s; p! B+ h$ G5 n+ p" F
    [size=1em]}
    , O! T. F+ u2 Y) q' S# E7 h! r! `7 O4 a
    [size=1em]class
    . M1 L/ ^% R4 j6 P  P! S[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU20 a0 V8 c' Z. S9 C
    [size=1em]{
    , i' p; o" k6 j4 |% c7 d[size=1em]public:
    , Y1 x* }/ O  C' D, o[size=1em]    virtual InterfaceU1* getInterface1()
    7 G0 Y- S( s, r- }, r& M, \. \1 u[size=1em]    {
    8 v, [" C( B: B3 i4 _: }8 W[size=1em]        return this;
    $ \$ ?0 H$ m: [" a[size=1em]    }
    " k) U. q7 n2 j8 ]+ [0 @[size=1em]    virtual InterfaceU2* getInterface2()$ j0 {3 s+ l/ m/ l5 o# [" j9 I
    [size=1em]    {
    2 B  H+ f( H& g( a+ I$ D. [3 ~. g7 A3 e* S0 U9 }, |2 N
    [size=1em]        return this;+ e) t7 a+ Q5 Q0 X( N. v) V
    [size=1em]    }
    0 x& G) P( ^# x/ ?/ x( g8 y[size=1em]    virtual void func1()
    & k4 v, r" y( I) d( M[size=1em]    {
    0 G. s6 i: G. I! a$ \[size=1em]        printf("%s", "func1");. t4 f( \' c9 N2 s5 ~$ \
    [size=1em]    }
    % b- T, Z* i8 k% X8 U! n
    6 V+ d0 K# X8 A, C% u[size=1em]    virtual void func2()( A6 h7 [  \; |1 ~% C
    [size=1em]    {
    6 X* X' d4 ], Z+ _$ R[size=1em]        printf("%s", "func2");
    % z8 k+ H9 R1 \[size=1em]    }" U+ D" D; L, @, d4 M( E' H+ t
    [size=1em]}  N" L' n7 Y6 x, \
    , `8 I) q; l7 V! l

    ) T: W7 M0 y3 D' a; V8 b% ]

    6 S4 [2 s6 s  N. M4 f& Y* |4 C$ C
    9 g; L# T% P" h8 j, g- q假设有如下代码:9 a$ u) ~3 o  r" ~  ]$ c
    [backcolor=white !important][size=1em]PHP code: i7 ]! h5 R$ j1 a* \
    [color=white !important][size=1em]?
    6 K% h' C& o  F: G# Y
    [size=1em]1
    % v0 ~6 a1 Q! i' P  A
    [size=1em]2

    - c: a2 P4 H6 y1 b& Y
    [size=1em][size=1em]Base* pBase = new Base();2 b6 c# r0 T  S4 c
    [size=1em]pBase->getInterface1()->func1();
    ; S" V  Z# j( J! T8 G- K' g9 a: y* V4 ~) }5 V  Y
    ! A  Z( Q( K/ [2 e% Z: L3 k
    # t: H8 b/ d; @

    , @- s8 A& j7 w2 X其实以上代码等于:' N4 j; D" {% p; `
    [backcolor=white !important][size=1em]PHP code
    $ L% T) @& o0 w& k6 X! Y: D
    [color=white !important][size=1em]?

    ' }' E6 V/ ^7 l) E. T# o
    [size=1em]1
    7 I0 K$ u( d$ y# z4 d2 ~$ K* d% E
    [size=1em]2

    + H4 b1 @7 ]& c# S' G" f. ?3 Q- |
    [size=1em]3

    * |/ B9 B& i; Z: I/ [; ~
    [size=1em][size=1em]Base* pBase = new Base();4 {. s" w' p' E0 A8 H
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();' `- d7 z1 Q, S3 t9 t6 l8 ~  z5 O+ A
    [size=1em]pInterface1->func1();& \# G7 d, p8 H" B9 t  e& J/ ]4 J

    0 _3 ?/ r' V6 V

    . w- C  {  n% J$ }9 M; T8 }0 i/ |8 l% {) E# E3 [
    9 Z* v' L; d$ F. L' }' N6 k1 Q

    / j  }4 B! p; _. Y  @2 b0 X9 d- K% I8 U6 p
    C++编译后,Base类的虚函数表如下:' Z) G) y* X# }$ M
    [backcolor=white !important][size=1em]PHP code. U; K' l$ H) X& k2 e. j! k- @
    [color=white !important][size=1em]?

    # X9 q$ Z* A( j  H3 T0 o* T3 M5 {
    [size=1em]1

      Y0 d3 G! C& V  _, h
    [size=1em]2
    7 ~$ e. a& g6 E0 S( ~9 e
    [size=1em]3

    ' K& X" K, C% h' h% k: d4 P
    [size=1em]4
    6 X8 M6 ~1 I( w$ T' u7 W
    [size=1em][size=1em]  
    $ ^5 U0 f$ `3 p) C! @' F[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|! z3 ^: A* z1 B
    [size=1em]vTable:InterfaceU1 |Base::func1()|
    ( F  z; ^# q+ V( ?+ M" u[size=1em]vTable:InterfaceU2 |Base::func2()|
    % i1 I, ~& G$ D  C# i  I
    9 V) F+ e6 t& y& Z0 P: r8 M% k

    " J" ^. C- D; ^, {( M6 m6 q  B; I  q# W2 r) L: M) S% ?" S
    4 n' j. \0 d5 \
    1 U/ f8 s$ |2 s0 n
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    9 G/ ?/ f9 r' g7 |但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。0 K- E7 o4 {; r% e5 _- E# x* B" O5 q
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    " d, u2 K% ~1 f, Z8 ?0 i; RC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    1 T( {9 F2 m) a0 ^5 Y% A
    9 z7 D# O) T" x0 l
    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-8-31 21:53 , Processed in 0.626444 second(s), 54 queries .

    回顶部