QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1703|回复: 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
    / D0 Q+ H' V$ f! Q! }[size=1em]      InterfaceU18 u/ X3 N" O$ Q, Q7 N
    [size=1em]  {
    & `: s! M8 E! y[size=1em]  public:
    1 t6 q' S- z; K! s, r' B- H' j[size=1em]      virtual void func1() = 0;
    , S1 S% V6 k# C0 P[size=1em]  }" ^  M( C6 }' N0 V: |4 Z! U1 R

    1 u0 g5 \6 ]9 |( X6 H[size=1em]  class
    4 o( y1 G4 r& g- Q[size=1em]      InterfaceU2
    : `/ h- d% G# i) i5 o* O[size=1em]  {. {/ J1 U& J5 ^2 c: E3 f+ t
    [size=1em]  public:1 E7 [* v6 B, O9 A; v7 j4 n
    [size=1em]      virtual void func2() = 0;: f7 g0 O) a" ]8 E
    [size=1em]  }6 y) Q( h: S5 V: n  O6 J" H5 e3 ?
    ( Q) R0 c$ v7 T$ f
    [size=1em]  class9 P# u9 R4 Z' u! k/ l
    [size=1em]    Wrapper% t9 d4 r& y: n0 r9 d
    [size=1em]  {
    & m8 i+ P  y  U6 k; P[size=1em]  public:
    . {0 N: M& X2 t) I8 k; R$ X% b4 g[size=1em]      virtual InterfaceU1* getInterface1() = 0;
    + K0 D/ g- R  H6 U[size=1em]      virtual InterfaceU2* getInterface2() = 0;; |5 r- y9 o& S* U0 Z
    [size=1em]  }* D- D5 b1 g9 Z1 b7 W3 ^
    7 U! ^7 U' W7 X' ]* s
    [size=1em]  class8 C7 n$ P. i$ `* q1 y, C2 w
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU24 K1 ]  w  y3 ~
    [size=1em]  {# f% L' @- W3 s/ N# D4 h0 {
    [size=1em]  public:; l* _8 Y( R7 ~, C$ M6 D( W  ?
    [size=1em]      virtual InterfaceU1* getInterface1()2 h8 l3 p/ C3 _* I
    [size=1em]      {
    " O) Y2 h: |7 M0 x5 X- N[size=1em]          return this;
    7 V* x0 ?" r9 |9 n8 V. Y[size=1em]      }: p5 }$ D# ~# v7 V$ |- o
    [size=1em]      virtual InterfaceU2* getInterface2()' y. S  O. a' K+ w7 r, d( s
    [size=1em]      {
    * B/ T/ G. h9 P7 e8 A+ y9 H% L/ z; f1 W8 T$ H# Q& D4 }2 H& j
    [size=1em]          return this;
    9 U. }/ x# `* v' S. C3 X1 D9 o) u[size=1em]     }% ]0 N; b# x7 s4 ]9 @- C
    [size=1em]     virtual void func1()
    ' n: a* A1 w; _[size=1em]     {" E% v+ H0 f) |( Y  h0 ?
    [size=1em]         printf("%s", "func1");/ d* M5 e  c. _+ f7 H1 X
    [size=1em]     }
    & @; x' N! E! P; l% n( i* e: C' p. I7 f5 o* r* [( M5 y3 |% p
    [size=1em]     virtual void func2()5 u, U# E( ^" d. h$ ^
    [size=1em]     {/ ^$ L: V7 q8 z" `: w- N2 }
    [size=1em]        printf("%s", "func2");
    - n8 e  P3 R. J9 j; m[size=1em]     }
    6 {0 d3 O- {, Y/ V3 W; u[size=1em] }
    + l, ~( f5 N+ }( t) K+ f
    ( f4 E, l, H" }

    * a( S# L5 M5 g; ?

    % _+ s, `" {; U) Q; l; ^! [: k+ Z4 w7 ]" ]
    假设有如下代码:
    3 n: k9 n2 x# D0 G' D4 o1 y[backcolor=white !important][size=1em]PHP code5 ]& P: d/ y  T! i% E# D
    [color=white !important][size=1em]?

    ( N" V; I0 J# v1 D. S, Y5 P: e9 O
    [size=1em]1
    + |# \# e0 P* v4 I3 c/ m1 {) x5 N
    [size=1em]2

    ' d7 \" @1 d' h# A. L
    [size=1em][size=1em]Base* pBase = new Base();% R. n% r6 b. b/ I4 D
    [size=1em]pBase->getInterface1()->func1();
    " A9 E, h/ b" i! k2 p7 ]
    ( e* d* D' C; c

    ( k* E) U% k  B$ S9 Z) v7 a1 G. {8 R$ f! L3 F( |$ z/ J

    : G/ K* W  E( y& k4 ?其实以上代码等于:: `6 V; T# H. }
    [backcolor=white !important][size=1em]PHP code
    * ]- P- ^& @" U; _6 V  g8 w0 z/ \
    [color=white !important][size=1em]?
    ! ?) O3 U! ~2 m* }0 N7 `7 F
    [size=1em]1

    4 I9 B& d! P" q! S
    [size=1em]2
    ! U7 M1 ]! {9 F
    [size=1em]3

    $ ~  W) W1 Y% R/ V7 m7 B: {" W8 U
    [size=1em][size=1em] Base* pBase = new Base();
    . ~  x$ h' b* T) h[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    5 O+ l# d4 e/ A2 B4 B[size=1em] pInterface1->func1();" G% O! m$ k- C: {
    9 E/ T* f0 C6 z* N+ K( g
    0 u+ Y& D2 z  z* m, D# e( a3 f, ?% A% u

    , e; K: `- j: x0 [: X; o0 @7 Z% Z/ D+ K) V- W/ M8 p4 l3 R3 J: W3 \6 B

    ; ~5 g: s$ ^3 o
    $ Z( n1 b4 }7 g6 b              C++编译后,Base类的虚函数表如下:3 ]+ W6 }  n3 J
    [backcolor=white !important][size=1em]         PHP code
    * s' G/ W( K% b) }7 z3 k
    [color=white !important][size=1em]?

    8 d9 M3 K5 ^) ?) _; y( @+ C8 H
    [size=1em]1
    6 w# p  i7 e* R  \: `
    [size=1em]2

    * h8 Q  C7 {" L$ {+ |1 V
    [size=1em]3

    0 Z( u9 ^- l+ [% P) ]
    [size=1em]4
    # v. v) I! C2 R, {; `
    [size=1em][size=1em]  5 y3 q3 `& j2 |9 _) }! R5 R$ Q
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    1 y7 }# I* r8 c) n8 o, v: o6 ~[size=1em]  vTable:InterfaceU1 |Base::func1()|
    3 {) W! D# a' k# t; u[size=1em]  vTable:InterfaceU2 |Base::func2()|
    7 @' Y5 }3 p, c+ D5 `4 u2 {$ L( N* q

    4 H1 k, j! W2 L+ s1 W6 O" L1 t- `
    + L! z# o' x7 C: ^( U: t5 y, C+ b2 r+ V* X# f

    8 b5 X+ J  v+ ~5 Z' g5 x     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    8 n# O1 ~  E& S( E! L8 V    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。5 z, }! R4 P3 S' t) A) V( e, l  p
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?7 G( M: J6 _5 u% `+ x0 V: e; u
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)9 O0 o, P+ [5 m% M# X
    ' f7 S4 U$ E5 A6 |6 w/ [" e" u
    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-5 11:19 , Processed in 0.438214 second(s), 50 queries .

    回顶部