QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2081|回复: 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% _. E1 t0 l7 R; }9 Q# }
    [size=1em]    InterfaceU1& r" `% }3 B5 a, H* F% I. N
    [size=1em]{3 h# Y) I5 R4 F5 P4 p. p1 U* Z
    [size=1em]public:
    2 M* V4 b: S4 H[size=1em]    virtual void func1() = 0;! W7 f9 f8 Y! f" M
    [size=1em]}- N# d  `7 K- {( R+ H

    ! J5 ^/ k4 d* K. v: G3 u[size=1em]class+ ~$ [6 U: i9 S4 ~" N8 \. q
    [size=1em]    InterfaceU26 {9 w, O/ }- c. J! l) H
    [size=1em]{
    ' W, _8 t2 n. _7 f) t8 @' q[size=1em]public:2 M' I) o9 {8 X' G
    [size=1em]    virtual void func2() = 0;
    # Y7 d+ w0 \# A5 e9 t9 M* {; k[size=1em]}! X' g- i0 w- x3 B6 L& H5 ?
    * E! v2 r* T0 ^' B" v6 S& S
    [size=1em]class4 Y( n/ N+ ?0 O3 ^: I- a- }
    [size=1em]    Wrapper
    . `1 U/ d  Z% _8 o  g[size=1em]{) B7 F% ~- G  T8 \8 W
    [size=1em]public:
    % v* d& a0 U! G" j* L[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    ( Q' Z2 q/ `9 C% W! @* f, o[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    5 k( n6 F" W4 G! C4 q, \[size=1em]}6 o. n% G) ^$ F& R4 m$ U. ?

    - G6 k2 ]/ ]- ?1 s/ L- Z( J[size=1em]class
    , F% N1 `7 B5 k1 W# O[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    & I2 W) f. ?2 B/ T# P1 ~[size=1em]{8 c. x4 x0 F. m% x
    [size=1em]public:, f6 q7 y- D; {% q! U
    [size=1em]    virtual InterfaceU1* getInterface1()* A7 Z: |% b- T4 z
    [size=1em]    {
    ) h6 D# p3 p) L! A1 a7 t1 w! t[size=1em]        return this;4 a" T, {- K' X* x" ~6 }2 B
    [size=1em]    }
    : @. o% G9 i$ c[size=1em]    virtual InterfaceU2* getInterface2()
    ( B# F( O5 O' ^" G[size=1em]    {& g  D& m% w! l2 q8 X

      Y. p: ]( k/ s+ R% K# q. k[size=1em]        return this;: }/ y  h1 ^. Y+ `; v7 e2 k
    [size=1em]    }; o  s( q4 E! C' [4 _1 t8 v! s7 ^
    [size=1em]    virtual void func1()3 n" q8 n  L; x
    [size=1em]    {  q2 `! x# K) k+ R" l4 L/ r
    [size=1em]        printf("%s", "func1");9 w, _  L: s7 {' e8 V) b
    [size=1em]    }- D3 }& l& `1 }: c8 S

    7 w# J0 e# B5 p' }[size=1em]    virtual void func2()
    7 p  k$ g( ~- [6 |* X[size=1em]    {
    ! e) Q' B* g; }[size=1em]        printf("%s", "func2");: e0 @3 Q1 c4 u) D' y% k* ?/ I
    [size=1em]    }
    ( d7 W1 [+ L8 Q( `; L[size=1em]}0 E) l/ t1 O( g8 r+ H( ~) D$ i) O7 `1 G
    * [( T: E* a8 A2 o& I0 N; w& x
    ' N1 E- ?# `: W# w, F
    7 |$ j" q7 M  g* R. |  Z

    $ D4 S& ~1 y8 E% {4 P: \6 Q0 z假设有如下代码:2 s6 i. p+ \7 u  Z0 H6 E0 }
    [backcolor=white !important][size=1em]PHP code
    / |6 ?1 i* q; y' c; J
    [color=white !important][size=1em]?

    2 D, p$ Q! M% Y: n" m4 E/ B
    [size=1em]1
    5 I% r% K  Z2 P3 U2 H
    [size=1em]2
    ; u  v8 h: R- V$ f, E
    [size=1em][size=1em]Base* pBase = new Base();4 N5 f: ?+ }& |. g% h; ~( G, V
    [size=1em]pBase->getInterface1()->func1();
    , s& G' F! j  E/ X7 d% r
    * `% f8 U* N) `
    5 v, |7 W& D) q9 b

    , @8 _6 f9 U. N
    9 H( d6 n6 R5 q& c6 u. o5 R其实以上代码等于:) p/ _; L: }- `2 G! t  n, r
    [backcolor=white !important][size=1em]PHP code, X2 b- t/ g* A# v. ^
    [color=white !important][size=1em]?

    # I* F' F: n. G' i% x
    [size=1em]1

    3 O* a3 l5 G6 V# E
    [size=1em]2
    0 ?: M1 f( o% Z; D4 P
    [size=1em]3
    & P8 \- ~; b; ]- H- k* [$ }' N
    [size=1em][size=1em]Base* pBase = new Base();
      y% [' l* d/ ^+ z[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();. M" A. J6 P8 t  A9 _. |
    [size=1em]pInterface1->func1();
    % N$ c  z2 r0 j& j- I
    ( z6 d' l# `8 \7 `5 |* C' k
    / ]- s% t; D- U9 [1 h

    + `( C) h# f/ A2 k7 T9 ], e' N( ?' _2 U
    . ^+ [* C% R$ d
    3 W6 e, n% k" ^1 p9 Y+ {: r2 Q
    C++编译后,Base类的虚函数表如下:
    " W8 I- _% A# s$ M% I[backcolor=white !important][size=1em]PHP code# I& L) s( U  ~( i2 N( g- V
    [color=white !important][size=1em]?

    ; I! @  V( l4 I* L% K
    [size=1em]1

    & _, m) P/ G  s% f& ^! U; y& o
    [size=1em]2

    ! }& y3 \! u' S* e
    [size=1em]3

    - T" j8 e- r: `) J! _# p
    [size=1em]4
    ; Q' q8 h3 E  z
    [size=1em][size=1em]  ! C6 x2 l) \% L* H2 a& f
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|8 f1 X& Y& n9 ^2 A$ B, R* }
    [size=1em]vTable:InterfaceU1 |Base::func1()|+ ^* W, `! @1 u/ h* n0 m- f; ]+ u
    [size=1em]vTable:InterfaceU2 |Base::func2()|: O" B" u3 M5 k; Q9 ]( b
    4 v! x, |8 f& L( U' `: b6 s

    7 P' l8 I$ I7 P- H. z+ W8 K- k7 {3 P' m0 @% ~

    ' B/ b" }' l3 A5 l$ e2 v
    5 `! E* X" l- t" X. Z4 q* M) k如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
      \1 I1 @, w. R. V/ \3 f& m但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    " D) x3 ~/ [: M* h# AC++是如何得到当前应该使用vptr[??]位置的函数地址呢?0 c, D) |1 d# ^1 t% G
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)0 P; K, d7 G- k5 w( g

      P# K) e$ P- @- Y
    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-31 20:41 , Processed in 0.435481 second(s), 53 queries .

    回顶部