QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2050|回复: 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( }9 ?5 O5 Z8 `7 n4 R
    [size=1em]    InterfaceU1" u. Z. ~% n& T! O& A) d  e; W
    [size=1em]{6 Z' ?# B" U! `# Q5 f) F
    [size=1em]public:. @6 g2 Q4 w$ c. P, y  p- ^
    [size=1em]    virtual void func1() = 0;  O, u2 T+ o/ f/ ?
    [size=1em]}7 P! w( _# v5 z7 ?! @
    / `: ~9 d+ `$ U/ t: X( P* V/ l7 ?
    [size=1em]class
    ' ]0 P& L' T* v[size=1em]    InterfaceU2
    6 _' d& i2 t& e) g[size=1em]{4 E; F' n! I5 g0 i. y/ O+ p3 M
    [size=1em]public:
    7 p5 T2 O& |5 V( K6 x& `0 U[size=1em]    virtual void func2() = 0;
    . \- J3 p( m8 V8 U2 T* ?6 V/ g[size=1em]}/ \" ]/ J- c8 h/ V$ P" [
    3 c  @1 F. I" t' s
    [size=1em]class
    - l) G( \! n) U. l* U4 S[size=1em]    Wrapper3 G8 [) [5 C/ g0 G4 |3 \2 \
    [size=1em]{4 x6 d9 ^1 k8 U$ i# l, c3 V
    [size=1em]public:# w( S. z! s0 b- p4 g
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;
    & t  H8 y$ d0 O4 I' }[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    9 d: ~- I* J4 r) b* g[size=1em]}
    1 F8 O. o& Q  k' n; ]- ?* }
    9 M+ t5 l$ a. o$ _[size=1em]class
    : r! }) H7 E3 Q) w6 S) x+ w% d6 \1 ~, G[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2* I# @, R' p( \3 ?
    [size=1em]{
    / ^0 t- A; g' K/ V  H- V0 a[size=1em]public:% q/ s; A& j: C5 t- ?
    [size=1em]    virtual InterfaceU1* getInterface1()
      \* D; G' g. M2 V0 G  A0 i[size=1em]    {/ g1 e% X4 P) i1 O+ c
    [size=1em]        return this;1 G' A( E4 _6 b* K; u  _. Z, F
    [size=1em]    }) J# z* f( E8 [5 f' x* w
    [size=1em]    virtual InterfaceU2* getInterface2()
    / p. V8 h8 a( c[size=1em]    {# |; w; t8 l2 B
    0 l' X% v3 q4 y; a" h7 F. \+ g
    [size=1em]        return this;& ]. ~. R6 b$ E2 X$ Q
    [size=1em]    }9 B% A! W/ W- U& T+ C5 ?9 K& \$ z
    [size=1em]    virtual void func1()
      H/ [& ~! R7 H, ~% ?[size=1em]    {' J6 C$ y; f3 L- F3 D
    [size=1em]        printf("%s", "func1");
    8 x8 S- Q- _" U5 r0 }[size=1em]    }
    2 g8 u/ |2 E: E. H2 x" G7 s" e5 A3 N+ ^
    ) e$ A( f; {% C[size=1em]    virtual void func2()( W4 s2 g  J) M& l( m
    [size=1em]    {' e" I# H: F9 Y
    [size=1em]        printf("%s", "func2");' N9 L# L1 {8 h& k
    [size=1em]    }3 }7 o" B- n1 ]9 H$ `
    [size=1em]}
    + i9 F4 p+ v, A& {/ n% a5 q- i8 J. G7 J6 \/ r" |

    # R+ I! l; Y7 Q0 N9 M8 ~! Q
    7 e' E7 z! Q2 E4 G& H

    - ?% p6 G3 w+ |* K假设有如下代码:% i6 w' a) C1 I, ~. t, e
    [backcolor=white !important][size=1em]PHP code% e/ ]4 U2 L  P: f# P
    [color=white !important][size=1em]?
      Y$ B, m" n) A9 ~
    [size=1em]1

    + E' n) Y# J- C. F8 n( t
    [size=1em]2

    # W' ?5 h  Y# E' U/ {' k
    [size=1em][size=1em]Base* pBase = new Base();
    ! D) F; k7 N0 n+ H  c1 w[size=1em]pBase->getInterface1()->func1();; L# i9 q# c$ {9 N6 c4 P8 C' e
    . y9 {  W' a! T9 z; t% r; `3 m

    # A5 d! ^3 ~9 z! f& T& h. d5 a) v7 Y( _) l$ I
    1 W+ t& r$ {  f
    其实以上代码等于:
    . ^' L" [1 f  U2 f[backcolor=white !important][size=1em]PHP code
    8 {& \! a. J3 S! f: z
    [color=white !important][size=1em]?

    6 p5 ^& F: c5 l6 Y& F& g# C; s4 e
    [size=1em]1
    1 {  }% b1 ?* |! n
    [size=1em]2

    + ~- n4 O% i% f& ]0 \5 x# _
    [size=1em]3

    ! g0 ~6 |6 M# \8 V1 D
    [size=1em][size=1em]Base* pBase = new Base();
    7 O& h- l  p: `- Z6 l[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    # i" w7 f0 q2 W3 W2 y[size=1em]pInterface1->func1();
    * G2 t) [" b! `* Y( @2 s8 D: j: g: F3 i+ c( s

    7 j8 ~; {9 @$ s$ n/ q9 C
    + v0 x& a- W4 T
    7 z& N3 M8 |7 M! q1 {) X* ?& }3 ^9 c
    3 Q5 U3 f7 S  P  r* x
    C++编译后,Base类的虚函数表如下:' }5 Y, A+ c7 h: O7 O- v
    [backcolor=white !important][size=1em]PHP code
    9 F- M1 `+ S# {( Y2 ^7 B$ s
    [color=white !important][size=1em]?
    ' k% e8 k1 d9 l6 V
    [size=1em]1
    ) S* G2 v% f+ y: q. o, ~& Z2 G
    [size=1em]2
    - g' B) x& c" \1 R0 X) E
    [size=1em]3
    8 n& u9 Y6 M  ^
    [size=1em]4

    , K' U# z0 X' ?7 Q. e5 u, T
    [size=1em][size=1em]  $ V4 @6 a; I5 j
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    9 ]: c7 d* f0 R8 d$ u" H3 b[size=1em]vTable:InterfaceU1 |Base::func1()|
    5 c/ b3 x7 u2 Z" h- S; n* G[size=1em]vTable:InterfaceU2 |Base::func2()|7 G& r3 v8 i8 R. I: Q  ~+ I

    0 x& v5 J  I* @5 A2 ]

    9 Z; c0 f6 g. S
    + r7 a' g) R# G& o8 Z6 |$ f. e* R  C5 L# K& G' t2 c! [) ~
    # K1 u) T* {. a) v' G9 i* f
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。+ \# c3 |& f' ?  {0 e
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    . W" j% \3 @6 ?0 [" QC++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    $ a3 R9 V: \* K9 D; V$ VC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)6 z1 Q6 M, b) \6 [5 Q- C1 A2 G1 l; c
    6 m6 o4 x+ I4 N" [/ 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-7-13 15:43 , Processed in 0.403897 second(s), 53 queries .

    回顶部