QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2118|回复: 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]class9 h; `0 e3 p! G6 V+ j9 E
    [size=1em]    InterfaceU1
    - ~8 S; A4 p- K5 Q& t[size=1em]{  I( e0 X3 _: H  K; `
    [size=1em]public:
    $ a6 Q; ?' ?# A, D7 X) f[size=1em]    virtual void func1() = 0;
    8 `3 \6 j8 O: l- _) }! o2 h4 l[size=1em]}
    ) T' Z. O$ l; N+ G& K* w9 b: }3 K- n! Z0 ?
    [size=1em]class
    9 l2 \4 B- V+ j[size=1em]    InterfaceU2
    - e6 u9 H0 G& P7 R0 J2 U[size=1em]{
    ) {1 B% @6 B3 ~, Q* X[size=1em]public:
    4 p7 v8 i3 f1 Y[size=1em]    virtual void func2() = 0;
    ) ]* W5 \5 ^% f[size=1em]}
    + P5 D" m- q( r; ?; i  z% G  u  q7 @5 @( b# w
    [size=1em]class
    - p& h5 y& b' V8 d8 C[size=1em]    Wrapper
    ( H6 {  c$ n3 _1 H9 w  P/ [9 t; h[size=1em]{: C4 i! [2 y$ x" P- V! \! R: X$ ]
    [size=1em]public:
    ' I. n1 Z: N+ I  ?' n[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    7 p9 M' Q! @, `" a* W[size=1em]    virtual InterfaceU2* getInterface2() = 0;
      L3 J0 A7 e: }) `  i[size=1em]}
    ; J3 j+ Z4 }3 _) G
    " D8 u% \9 F1 O/ f[size=1em]class* e$ G! M# ?- u: A9 @% |: i$ H5 Y
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2; K; e0 A! V! ]# D* V' n' X, E2 i+ u+ [
    [size=1em]{7 F$ e% P7 P, i  D, ~3 d
    [size=1em]public:
    2 ^! }) ]0 T1 e8 Z+ L+ e[size=1em]    virtual InterfaceU1* getInterface1()1 U0 G/ Y$ y  u, D6 t
    [size=1em]    {5 E, h' |# t: u: x/ W' R
    [size=1em]        return this;: B& W1 y, I. D, U' w
    [size=1em]    }5 Z" m5 A; t- \6 _) Z. H
    [size=1em]    virtual InterfaceU2* getInterface2()8 A6 u7 a. y9 B6 I% _
    [size=1em]    {
    3 V& ~0 _- R0 h2 {+ M7 d3 ?% V
    # i' T7 D; k  ^/ Y0 V[size=1em]        return this;
    3 r/ t! t9 K! I  ^6 B[size=1em]    }5 H) d# n. ?" x+ ?( V# _) q
    [size=1em]    virtual void func1(); E' l+ ]2 T& Z& H- Q4 G! E: s/ t9 m
    [size=1em]    {
    - \4 c) p+ O& F. D9 Y$ m/ q[size=1em]        printf("%s", "func1");6 |4 ^8 G* w( D; z
    [size=1em]    }
    ( k; `, [/ d# K" z
    # a4 ]' @: _; [4 D' J[size=1em]    virtual void func2()9 [0 ^/ L: X# x9 n2 g
    [size=1em]    {; I3 }3 r- ^/ D, `2 H% F
    [size=1em]        printf("%s", "func2");3 y$ r; y7 }3 A  i1 O
    [size=1em]    }
    2 Z) i6 m$ P# c4 T[size=1em]}
    : ~" W9 P* ^% f) i2 P$ E" H) B8 N1 }7 Q& V: K! p( x
    6 \6 _# Z' b& r4 I' ]: Z
    9 ~6 }# R' Q6 {
    1 C3 ]$ h( D$ Q. j$ _' O
    假设有如下代码:3 X, y4 ^) ~2 R/ L1 B& Q. P6 v
    [backcolor=white !important][size=1em]PHP code
    8 S' g* d9 q$ J( a, v: \
    [color=white !important][size=1em]?

    # v2 |0 M0 W& V- g; \4 ?" I
    [size=1em]1
    3 _9 H! g2 y  G, @, j0 f" u
    [size=1em]2

    # g3 P& G* w2 Q4 l1 u
    [size=1em][size=1em]Base* pBase = new Base();
    4 M$ s' c3 R6 N  o6 C8 k9 Q7 o- s: J[size=1em]pBase->getInterface1()->func1();' c: h8 |! G7 e: _5 Q% E
    9 u" c4 h" Q- X' J
    ) Y4 x) [2 \. ?; W

    ; j7 g, V+ D- X- a& M
    ; j$ [5 G2 V) E; _( x7 \6 \其实以上代码等于:( }( J- ~& a( K4 [; [: |6 i) x  K
    [backcolor=white !important][size=1em]PHP code" C$ e! f' Y; `* I
    [color=white !important][size=1em]?

    . B9 H' ?' P, Q* a$ i/ C0 r: }
    [size=1em]1

    # n# b! D0 T! T. o( T9 i- N
    [size=1em]2
    ' H4 G! [$ A! F5 b, y: n: E
    [size=1em]3
    6 {0 W2 r& ^. V/ M: o1 @
    [size=1em][size=1em]Base* pBase = new Base();
    ) K3 |8 M( z* Z) H- b4 c1 E[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();! ?, U8 c# x% _. {, z
    [size=1em]pInterface1->func1();. ^" X5 Y+ J# F0 F

    ! {3 U( q. H; \# O

    4 c) G: v1 k) P" E1 l& t
    ' F  X9 R: {  ]: W( N# c8 B3 _' P; M: t9 T/ B* c

    $ }1 Z/ U. W  {% z; _- h% Y; |! r' A$ _
    C++编译后,Base类的虚函数表如下:
    " k7 V9 Z% \7 R1 Y7 S[backcolor=white !important][size=1em]PHP code2 A# v' t- Z# v* @
    [color=white !important][size=1em]?
    1 o0 C7 ?& D& c( h& l+ ?  H2 ?
    [size=1em]1

    0 o$ t# r% S/ f; p9 w
    [size=1em]2
    " p+ j# R" W5 r( \1 n. O3 B
    [size=1em]3
    , |- R; s% |9 q6 H- M
    [size=1em]4
    4 Z7 l- h0 C9 K' C  @4 v
    [size=1em][size=1em]  ! n0 {2 a1 _! J# C" y/ ^
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    7 \: L( }- F& h1 B4 u6 n[size=1em]vTable:InterfaceU1 |Base::func1()|9 V0 U. I4 a! S
    [size=1em]vTable:InterfaceU2 |Base::func2()|! [. @- y& z$ U* H, i$ B# o' f7 H
    6 @  I7 g# H; {8 O' L3 q- `
    ( n5 E2 w0 y6 i% O
    & J  U8 e& K2 {+ F( `
    ' ?4 r; ^  K- P9 m1 C. s# ~( x2 \

    7 J* X' v8 K9 O3 H$ b8 T) N4 x, T如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。- s3 S. Y% ~+ q  v, e) R
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    / P# i( Z5 L; M0 W8 P+ l8 D, wC++是如何得到当前应该使用vptr[??]位置的函数地址呢?, v6 R  B% c. z' T: n. v8 S9 X
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)* V2 w+ H* z  l: q) y9 y  s

    0 u8 Q/ s( Q: L" ~
    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-9-24 19:21 , Processed in 0.317129 second(s), 54 queries .

    回顶部