QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1636|回复: 0
打印 上一主题 下一主题

C++ 中多继承情况下 如何确定某个类型的方法,在虚函数表中的位置?

[复制链接]
字体大小: 正常 放大
蕾欧娜        

19

主题

9

听众

25

积分

升级  21.05%

  • TA的每日心情
    郁闷
    2015-4-14 11:21
  • 签到天数: 1 天

    [LV.1]初来乍到

    自我介绍
    德玛西亚
    跳转到指定楼层
    1#
    发表于 2015-4-17 09:51 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    [backcolor=white !important][size=1em]
    [size=1em][size=1em]  class
    4 p' I; J! @+ c) g) W5 |[size=1em]      InterfaceU1; _7 e& a; S8 ?& w
    [size=1em]  {7 C  f5 l2 D. `( D4 }  I5 A7 e
    [size=1em]  public:
    % M% c2 R1 ^$ D9 ]  o& y! H[size=1em]      virtual void func1() = 0;
    $ D8 _0 q0 P8 b) o[size=1em]  }3 q# z: K, d$ d  j

    , T7 r& V5 ~2 w9 t7 g* X# C[size=1em]  class
    ) c) M- \/ @9 w4 k, B" }[size=1em]      InterfaceU2; u. o: X* n8 x5 x! d3 H
    [size=1em]  {( P7 u; c6 }8 j& Y$ \
    [size=1em]  public:
    # c3 H# Q& C9 ~4 Y9 z[size=1em]      virtual void func2() = 0;, ~5 x5 Z! R( a8 M0 P; B
    [size=1em]  }
    4 A% d0 `2 T9 {5 l4 N
    . f4 X, e4 C5 B1 r. B% k[size=1em]  class3 H3 ]& k7 z) h2 f
    [size=1em]    Wrapper% @* u2 X# _: ~( ^: X
    [size=1em]  {
    , L% L3 O& R# P7 ?+ ]& }% @" \% ~[size=1em]  public:8 v' j5 \6 H# t9 R& H0 {
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;
    + L3 @6 g2 X9 a* t% L[size=1em]      virtual InterfaceU2* getInterface2() = 0;
      a. d1 Y5 w; f4 L3 [' p4 p[size=1em]  }3 h: l0 I% Z$ D; X/ O; ], {

    7 a9 d4 |# E4 Y% D# S[size=1em]  class
    ) B& @! `( |. @[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2
    , U$ `( j  q8 v[size=1em]  {! [$ N7 X) ]4 I6 K
    [size=1em]  public:
    3 n/ R' @1 R0 V! v2 f# |! S8 ^[size=1em]      virtual InterfaceU1* getInterface1()
    : [. V- {) m3 Z[size=1em]      {+ o  g, ^4 K9 ?1 P7 E: u( |6 H
    [size=1em]          return this;1 [* {* l: J' W
    [size=1em]      }& \2 w6 [- t2 N/ r6 R+ ?* p- y
    [size=1em]      virtual InterfaceU2* getInterface2()
    & F# Q; Q* W3 H6 S+ p+ L5 J[size=1em]      {
    . M8 A: {7 e3 O2 U$ I/ W" a0 h- R5 U: `& e
    [size=1em]          return this;
    8 S' d" N6 E8 ^( w2 X[size=1em]     }
    & S/ x) _$ O0 Z[size=1em]     virtual void func1()
    5 s% K0 Y. N, n. j7 T- d[size=1em]     {
    . F1 t7 {) u6 |7 L: D% P8 |# o[size=1em]         printf("%s", "func1");
    6 _; {( ~* q3 |2 T[size=1em]     }9 [( }/ A9 k) G% ]) A
    * ^' q6 W& A) y
    [size=1em]     virtual void func2()5 ]5 M: ], @/ F' n/ K
    [size=1em]     {
    - I  ]1 z) A+ F) Z[size=1em]        printf("%s", "func2");% ^; e: p8 P  F, A! B  i
    [size=1em]     }' e- N; V. [4 Q  {, Z* |& \
    [size=1em] }
    4 V1 g- K+ U4 l) N  f  @( l& D3 g* _4 w! i; c& ^% l; Z$ A

    3 Z  K- }. w- E0 z& ^! L/ m
    # k! x0 @9 `4 f
    9 ]% g7 J; [& w7 B6 i
    假设有如下代码:
    7 R+ P9 a+ M! V[backcolor=white !important][size=1em]PHP code
    2 R/ o& x8 K. i4 d. L- g
    [color=white !important][size=1em]?

    ; z/ I% o; h+ L0 [9 s2 W
    [size=1em]1

    . A* Y1 t$ K/ f( [& Q
    [size=1em]2

    ; q- y  B* I" e, D' c# g. l
    [size=1em][size=1em]Base* pBase = new Base();  S0 o9 x3 E1 `$ z( i; F& b, G
    [size=1em]pBase->getInterface1()->func1();
    9 B2 a; Y6 S5 D: X2 i& ], N" D9 L/ B" a! u7 U. M% O+ ~% c3 u

    3 {3 S0 k/ L: x6 `
    & Q: r: I. r; z" I9 @1 V; |; I' L9 L. P  \  o
    其实以上代码等于:
    0 o" y# B0 v# G$ z2 O5 I[backcolor=white !important][size=1em]PHP code
    0 q" p$ x9 R( Y! j
    [color=white !important][size=1em]?

    + u6 m3 X* b* F& B5 h' L
    [size=1em]1

    ; X& I" c# W# O
    [size=1em]2

    8 U$ L8 _6 ~5 O, U8 X( s; E- q1 m" Z
    [size=1em]3
    5 K- I" C8 g- H
    [size=1em][size=1em] Base* pBase = new Base();
    % h9 z. ]. ?7 ]* P; s2 s8 }" e[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();9 R$ G, K7 ]' e* l) X
    [size=1em] pInterface1->func1();
    - G0 r/ S( {! y7 |" C. M7 W- p  G% h+ ^, m' K7 P4 W6 J7 M
    , }& Q  M9 w) e1 z' S7 D

    + G; |# F8 }6 _) b# a8 R0 r' i2 {; t; m* X/ F. D8 D; i% W$ n
    % u. E, l8 V$ P& d& I
      p& c' \' |  V. y0 `1 _. |
                  C++编译后,Base类的虚函数表如下:
    ( X8 ^1 }% V& G$ {. N7 y[backcolor=white !important][size=1em]         PHP code: N* P: v& H' V/ ~( i4 q8 o8 i
    [color=white !important][size=1em]?
    - A8 h' K) a, f5 ?3 L2 t* s, I
    [size=1em]1
    ) V' q+ I! W' `- s! Y: u2 p6 J
    [size=1em]2

    3 M" P+ J  C% S- n6 ?' i
    [size=1em]3
    5 ]) V7 P# N% }- P
    [size=1em]4
    # p8 f/ ]* ]0 V, c+ u0 M. f
    [size=1em][size=1em]  
    ! O# P2 M* @* }[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    / p- j% ?% R1 T- c" J' X; ~2 O[size=1em]  vTable:InterfaceU1 |Base::func1()|7 c) W7 K" x( |& }  y
    [size=1em]  vTable:InterfaceU2 |Base::func2()|
    7 _; R" b; T* f. J+ m" o  S" f4 }/ d' o- O

    ) {7 d9 I" V) C' Y* O9 W5 d! }
    / [& P' W" I  n# v0 f0 N. e
    , H7 ?" _% U. u5 A: g" X7 I: [
    4 x2 ~5 n2 t8 ^2 [     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    1 i7 @5 r% w: s# ^0 c    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。% Y3 W, Y/ y# e% g9 h/ Q# W
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?# e7 Q; f  B7 }5 b  [
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)+ A5 K: [% W9 K& A8 R0 O2 G, q
    ) u% l3 y7 W* E. U- A* j2 T
    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-19 06:16 , Processed in 0.612655 second(s), 50 queries .

    回顶部