QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1704|回复: 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! v3 l1 ~4 R$ _
    [size=1em]      InterfaceU18 w: U' |* R6 m9 \  H: i3 }
    [size=1em]  {6 F6 k0 z) p; W$ I, O5 M( c
    [size=1em]  public:3 V- g# ~& t7 k0 u+ O! ~
    [size=1em]      virtual void func1() = 0;4 u& E% a+ A4 A
    [size=1em]  }
    . r- a8 a7 U9 D- y% q2 I0 z
    & @* Q5 o/ R( |, N" x: v[size=1em]  class
    3 ^/ [6 p8 ^7 z; p% ?[size=1em]      InterfaceU2
    & N' s% s3 [- n; U[size=1em]  {7 a6 G- b7 e# q- Y" @# d/ h. \4 t& b
    [size=1em]  public:
    * F6 L4 X! I- b" K9 N6 K; s[size=1em]      virtual void func2() = 0;; e% y+ D' q" [* k' i) T* d  f: H
    [size=1em]  }; j5 b- h0 j9 H9 \/ Y+ @: ~& Z, T
    # D" u! P' D3 z3 J
    [size=1em]  class
    6 `1 n: e! d+ J6 n& ][size=1em]    Wrapper
    ( A8 n1 v& d, R+ {# _' _- S[size=1em]  {# ~+ |& w9 ~6 \& m
    [size=1em]  public:* C- I5 L7 u7 q; _( Z3 ~
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;8 K2 g5 O5 I/ ]' h
    [size=1em]      virtual InterfaceU2* getInterface2() = 0;2 O  x1 l; B# ^' G
    [size=1em]  }) T* N; ^! q- P0 f' p+ ]
    5 k7 w7 O2 ?+ J: s8 q3 p/ x  M! r! b) P
    [size=1em]  class/ ?2 S" R0 r# c
    [size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2+ c1 d$ j: A- c
    [size=1em]  {# j3 [- x$ h  a8 P! |/ \
    [size=1em]  public:
    , e7 S) `+ Q& \[size=1em]      virtual InterfaceU1* getInterface1()1 w6 a. ^0 y! I  T8 P, C$ G" h
    [size=1em]      {
    & y( m# q0 I. J9 m7 N  \' Q( h8 c[size=1em]          return this;
    , n. `' V* i* u5 U5 }- v( {[size=1em]      }
    : ]* R  w& A7 x' J: }0 u[size=1em]      virtual InterfaceU2* getInterface2()7 d% ]0 J7 d  Y8 b+ n
    [size=1em]      {
    1 e0 f9 m! K& L6 C* B3 C- p, P% {, ^7 t3 }9 u, W
    [size=1em]          return this;% R7 D4 [& f+ l+ m; P: P2 M
    [size=1em]     }% e1 o& F2 v' N
    [size=1em]     virtual void func1()2 _  J4 o/ g; ^& w) V9 {' P
    [size=1em]     {$ q" {) z# X" s5 k% M! Z: Z
    [size=1em]         printf("%s", "func1");+ ]7 G) {1 W, C+ p, g
    [size=1em]     }# H6 v3 s8 c) ^) A
    * R2 A2 `8 M& J9 u1 {3 z8 z) R4 K
    [size=1em]     virtual void func2()
    0 J9 r: J# l2 |3 X[size=1em]     {
    3 I6 g: }8 J! r7 |9 `$ V3 w[size=1em]        printf("%s", "func2");
    ; M( c; z" V7 \6 I2 G9 C: o- D[size=1em]     }
    ) t' R( c, h0 i" G; V+ `( F$ {[size=1em] }% m2 I  d; `& ~. S
    $ I6 ~8 c, y  ^* w) h  Y) x; u
    - U+ }/ P6 ^- H" z8 H: P5 o. C

    ! d. T& i* t; z: T
    & C: i; u8 \! Z4 j) E2 [, _假设有如下代码:
    3 p1 S, t, e4 G+ o, m1 U: V" h[backcolor=white !important][size=1em]PHP code7 n* r; Y( F( S7 v, K! s0 \& q
    [color=white !important][size=1em]?

    7 R6 J) e# C' ~  t& N; u
    [size=1em]1

    * k( O7 a  }: a, f7 p
    [size=1em]2
    ! L  P% b- k* Z: J' [2 ]
    [size=1em][size=1em]Base* pBase = new Base();8 u& U. Y* S' z9 ]1 A  V
    [size=1em]pBase->getInterface1()->func1();
    + F5 U) q6 E( o3 d2 s4 h5 R
    3 j+ C0 s' M- n& c" B; S$ m" u$ V

    ! g4 _7 Y3 @6 F. l) d3 c; x$ T6 I% F/ {1 d2 P

    ; W# o6 A; ?. I4 ]6 |/ u其实以上代码等于:% p- U; N3 m8 S. C. s2 p7 J
    [backcolor=white !important][size=1em]PHP code
    3 a& c5 N) o9 H9 m
    [color=white !important][size=1em]?
    ' E  D6 T  z  O( \" U9 d; S) B$ U
    [size=1em]1

    6 V# C8 B7 ?# |9 Q3 i
    [size=1em]2

    - Y( J* c/ L9 v" o2 m5 y
    [size=1em]3
    ' T4 [0 a( ^+ _% `$ o0 P
    [size=1em][size=1em] Base* pBase = new Base();: t9 h! u  W* J
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();
    ! P  V$ t9 E, ^) i/ n7 T[size=1em] pInterface1->func1();
    4 Z) }; Z% q( b8 L3 L. s" a/ I/ v* V$ O4 b

    ; |& z3 G) X: l! m2 L6 s% D
    + G/ \! L( s% o2 @* g" r+ z0 S$ f
    7 W, ]( v+ w! I( U5 e+ s2 Q, ^  ?( j4 \: {0 }2 x

    8 }4 L: a# `6 C8 s. L              C++编译后,Base类的虚函数表如下:
    ! b/ O8 r, U$ v[backcolor=white !important][size=1em]         PHP code0 C8 r: ^2 h2 \7 H7 z# Z: ]3 `
    [color=white !important][size=1em]?
    ; |- ]0 H6 _  ~6 {0 U6 E  a
    [size=1em]1

    5 i" S6 Y8 w- B0 Q
    [size=1em]2

    , p  X8 I/ V  h7 w) e( O
    [size=1em]3
    , w! }( v* [, R  {. d7 O! U
    [size=1em]4

    : a4 n8 {0 b% l! o
    [size=1em][size=1em]  . b: |- S. p8 k9 o: G
    [size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|) T4 e/ l9 R0 u( F+ [$ N
    [size=1em]  vTable:InterfaceU1 |Base::func1()|6 c6 l* e# V( s) U5 N! K1 X) r
    [size=1em]  vTable:InterfaceU2 |Base::func2()|7 n# P) ]+ [# T* T+ w

    4 j9 U$ `& ?/ a+ Z8 }* o+ v$ G8 d

    ' X& u' k0 F1 g" n/ E
    3 T' T7 [7 O/ ]
    & P+ H. e2 c& g4 C0 d
    # \9 [' B% j% f, ^7 ]     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。! F* T* ~. |' H, |, t! {
        但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。( E" a& T3 y8 c+ i" }
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?- Y4 t; f7 \! U8 L# U" v" N$ Z3 B! v
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)% P7 G/ ~) |( f: H' H- ^0 M
    ! n5 F* A. g4 z8 l3 }$ {* ~
    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 15:21 , Processed in 0.433372 second(s), 50 queries .

    回顶部