QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1622|回复: 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]  class2 ^9 e" z. ~8 g1 z! [
    [size=1em]      InterfaceU1
    " E* ]1 {) ], x" G& {6 l+ U[size=1em]  {
    : V" g) Q- Q6 z4 Y& b3 `4 W0 O[size=1em]  public:
    9 P; p( n$ i, u6 a[size=1em]      virtual void func1() = 0;0 z! ~# l9 }$ }% v+ \, H7 j
    [size=1em]  }
    * P2 e# a9 P9 y, f$ u
      S. l  {) Z1 @[size=1em]  class; Y- x+ x/ N( u. k" |1 x& g5 a- U$ r! {
    [size=1em]      InterfaceU2
    ) W1 [% f( M9 b- y[size=1em]  {6 A/ e* [3 q% j  n
    [size=1em]  public:
    / |1 Y1 y3 [/ ~4 _1 T8 m[size=1em]      virtual void func2() = 0;
    - T! w2 E- o" P[size=1em]  }
    - f6 X" O8 K# e& ?- E+ u$ M9 Y; B7 y% k  n* ]! P2 E6 [
    [size=1em]  class
    9 x' j' X0 f7 @& i+ a[size=1em]    Wrapper
    ) `+ \" R6 w9 o; p8 K[size=1em]  {7 H  ^( n  k) B+ y# S( g6 F/ a/ y
    [size=1em]  public:' J- w2 [" R+ G( u% ^
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;
    3 K2 d8 f0 n% U& i. B3 e; G9 x- w* J3 a[size=1em]      virtual InterfaceU2* getInterface2() = 0;7 V2 I7 F3 ~" W# i0 _
    [size=1em]  }6 V% d8 E. X, }( n0 C, E) @

    ' T$ e0 V3 m% I% z! g2 x1 _9 O5 _[size=1em]  class
    3 v' |' Q  x5 l0 [[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2
    & U1 d. b+ Q8 u* s5 Y[size=1em]  {0 L% L% R! v# R" P' ^
    [size=1em]  public:0 T& F4 x; w0 O& Y# s, ?, `% G
    [size=1em]      virtual InterfaceU1* getInterface1(); M- _+ t3 r# s$ @1 k
    [size=1em]      {0 _& E9 M9 R* a1 z: B0 U0 A
    [size=1em]          return this;1 e3 N7 [1 i' z9 Q. ?% `3 u4 W1 N
    [size=1em]      }& \; f7 Y, O2 z0 n) d+ ~
    [size=1em]      virtual InterfaceU2* getInterface2(); M" v* r6 h/ d; c8 n, ?- ^8 O
    [size=1em]      {4 G/ A/ O3 d7 |1 q, X

    5 V+ g; K1 L1 o( C! ^% P[size=1em]          return this;/ E3 \  m+ m5 A) d& g0 g
    [size=1em]     }1 G& t+ b! p: b  w
    [size=1em]     virtual void func1()
    3 o7 g$ V% G$ B7 [8 d[size=1em]     {! ]2 Q9 W- R3 [9 \
    [size=1em]         printf("%s", "func1");
    % v. k; J# }; c& }: E1 {* w( i% P  H[size=1em]     }
    4 ]; J, n8 @, [! I( `
    9 |; }2 p* \3 @$ q9 f. p) `[size=1em]     virtual void func2()
    ! Q; ]# T* M( h( |7 s[size=1em]     {
    ; w; g/ J* M0 c+ c[size=1em]        printf("%s", "func2");1 T0 [$ w. n' [% k5 m: L$ o/ u
    [size=1em]     }
    ) f; K/ U8 ?% ?1 F[size=1em] }/ R% [- `/ e1 M$ |. I

    9 Z7 T3 F! }. h' N" X
    6 g, D/ N7 M4 T2 m8 v3 j' Z! I) _9 ?) G

    4 L: ?$ o8 v7 T/ P( J( J$ M* ~! i# c
    假设有如下代码:5 `. @* H# d5 v: v& a1 s
    [backcolor=white !important][size=1em]PHP code: R; ?; C* F. g7 X- t
    [color=white !important][size=1em]?

    % Y. W4 p" w2 R" }- B7 X6 k
    [size=1em]1

    ; B7 W2 S5 A1 n: ~
    [size=1em]2
    ( {" c' |, |, ]
    [size=1em][size=1em]Base* pBase = new Base();
    5 y$ Q' \2 A. K& h/ G) f8 n[size=1em]pBase->getInterface1()->func1();" J9 K/ H6 h) p, i! ~

    ! ?0 J7 B3 R1 @: b  U4 m* x2 @& o

    * a4 c8 t! r7 ~7 y. x! i" a& D6 p3 w$ S, x. n& l

    ) h3 p0 l6 z6 \/ ^1 G8 D- h0 K( J其实以上代码等于:
    / y4 H( [# \, s" k/ Z' ~[backcolor=white !important][size=1em]PHP code1 W9 x7 c5 f" L! _! m; O- ^5 z
    [color=white !important][size=1em]?

    4 ~$ _( t; ~$ d; X
    [size=1em]1

    3 ~) }0 F% \7 |% _9 `& {
    [size=1em]2
    - C6 i3 j& e* h5 q: d
    [size=1em]3

      A  ^% A: J, [3 F) r0 T3 F
    [size=1em][size=1em] Base* pBase = new Base();
    . r; o( P+ m5 ?5 `' S[size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();3 n3 f2 ?- C5 _. u8 I) a% r
    [size=1em] pInterface1->func1();! e# X. ?- \- p# m7 ?
    - B* S: ?* J! P& ?7 q, C4 W

    # i  y# l3 J6 [$ x+ u2 E9 F7 H9 x1 o  L; r2 ~% ?
    ) J  M; \% l) \" n
    ' b& D! F, e/ f; `& v4 V
    8 a3 I; T& o: A6 Y7 w% C
                  C++编译后,Base类的虚函数表如下:
      c8 g+ e4 V8 s8 Z+ s2 p# v[backcolor=white !important][size=1em]         PHP code  m1 G% C: n9 D. X/ T& w1 y
    [color=white !important][size=1em]?
    ) U6 T: F6 d. b1 Q1 |/ Q7 U# m; ~
    [size=1em]1
    * I2 \; K1 D9 E
    [size=1em]2
    ) z% w+ {- j& ]
    [size=1em]3
      l, W1 O* T: i8 Y2 n% C
    [size=1em]4

    3 s1 G# d' {* p$ [( S  B
    [size=1em][size=1em]  
    9 W. P# J1 v4 x- J7 `+ g; S[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|+ M8 o- X& C/ f) b/ E5 K, ]
    [size=1em]  vTable:InterfaceU1 |Base::func1()|7 `7 R% U9 i7 S
    [size=1em]  vTable:InterfaceU2 |Base::func2()|
    6 G" j: M* x& K/ p0 w# Z2 x9 p5 W# O$ a4 \' ?/ I

      e6 _1 y7 C5 q
    : ^; _8 p/ B; l1 K( M: `5 M# u; I9 V. G

    . ^3 M# h# K& w# u! @. ^% N1 c     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    5 t: @" @( e' ?* J    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。; ~" R5 D2 q* A& P& k# S
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?8 _) ^6 @4 O; e3 c
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    . {) j9 z' y3 R- `' e1 X
    * O/ M0 h# }6 R" l( O+ ?
    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-11 06:33 , Processed in 0.736920 second(s), 49 queries .

    回顶部