QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2067|回复: 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. c5 A7 ?: e1 B$ w4 u' E& S2 h
    [size=1em]    InterfaceU1
    4 I. t% G6 w# h" \) j0 R[size=1em]{4 w$ n, l' d$ j  K: _5 u. ^2 q: M
    [size=1em]public:) O1 Q. |8 v3 R6 R, Z7 D5 W/ ~7 a
    [size=1em]    virtual void func1() = 0;
    / G+ K) ]7 V4 e[size=1em]}4 S6 ~3 Y: F; O- J
    " r3 F. ]4 X' U. T; s' ]7 c
    [size=1em]class
    - U, I5 H0 D0 d' Q" |! Y[size=1em]    InterfaceU2
    5 B' E: _  b) {! F# a4 X' H[size=1em]{4 z' l3 a9 j" Y# f! o; M
    [size=1em]public:
    1 f& L; d6 E5 k, n, m% i[size=1em]    virtual void func2() = 0;5 o+ U/ s  A7 H2 z( \1 A8 q% y
    [size=1em]}5 X8 q3 D. k3 J5 \
    / u$ m8 |  M; u$ }3 N6 `
    [size=1em]class) p' c8 [( S' w; k; X* y
    [size=1em]    Wrapper5 M9 Z- \# H! R# u" D. X( _# e+ `- ?
    [size=1em]{/ ?9 P& F0 i4 Y$ c0 J7 e
    [size=1em]public:
    $ N& q7 C( b$ J  }4 p: o8 h[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    * v) T/ \" M- H[size=1em]    virtual InterfaceU2* getInterface2() = 0;$ n4 \; K& ^  J' Z
    [size=1em]}9 X  u  R) X6 Z7 J& T
    * L1 }0 s% I- s8 k5 |+ u
    [size=1em]class4 R# T) K5 l5 p# j$ {# i8 Y8 `/ Q
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    9 x- w9 W; J' s7 Y[size=1em]{; a# {3 o3 b1 r: C
    [size=1em]public:  u4 N, c( d* v6 @% f! y1 U1 q
    [size=1em]    virtual InterfaceU1* getInterface1()2 ]( O3 k0 P# g% Z! c! C
    [size=1em]    {
    3 J$ t1 i& L% {" e9 i4 g& J[size=1em]        return this;$ Y& @2 H) P7 U5 U# B* i8 t4 \6 ~9 E
    [size=1em]    }, x1 g* Y! W& t& R3 X' V
    [size=1em]    virtual InterfaceU2* getInterface2()
    ! W6 A0 j  z2 d# i* G3 O4 B: p[size=1em]    {$ P' @" S2 m* Z- |( F  H9 m
    / V! P. @6 k. z
    [size=1em]        return this;
    , r7 J6 X' r" ~4 Z% O' t[size=1em]    }* j! I8 H, Q, d& U4 z3 q
    [size=1em]    virtual void func1()/ C+ \9 E* Q% ^5 D
    [size=1em]    {- D2 ^" x6 H" M
    [size=1em]        printf("%s", "func1");# N2 W( ~7 a$ A1 z9 K
    [size=1em]    }
    # J4 `9 j, N; [) b% V
    6 Z8 z0 Z0 b$ K/ c' [[size=1em]    virtual void func2()3 g8 f! `; y" B# b$ v
    [size=1em]    {8 S7 x) j- y. U0 a
    [size=1em]        printf("%s", "func2");
    6 ~% h$ l( {- O[size=1em]    }( P3 q( P# r& y% P/ [
    [size=1em]}
    0 Q0 o- O, Y) I7 z6 ^& ~5 y0 N4 B5 y: k* d6 \  z
    ( j% K1 n& s/ e" |4 K" j

    3 J8 k- c; l4 X% ~* ^* o5 T' U2 f
    假设有如下代码:# M& j1 m; q* ?/ S
    [backcolor=white !important][size=1em]PHP code
      l+ R' V2 U$ }  t8 c) K" a
    [color=white !important][size=1em]?
    # l; r5 j. z. [' E) ~$ L
    [size=1em]1
    2 n: w9 c& ]$ O$ e: H: D  O
    [size=1em]2
    2 N6 h% r& r% r/ i3 |5 _; }
    [size=1em][size=1em]Base* pBase = new Base();1 [7 h/ r; J- D/ s4 O) A
    [size=1em]pBase->getInterface1()->func1();
    ( L) H2 D) H, b* n+ ^7 i3 @
    2 X' o4 p' Y, ], g

    , I2 P6 U) B% q9 Z8 n5 S& l/ B
    ( P; S- I- b2 {/ d
    3 Q( e. u# p% e0 V& P, o其实以上代码等于:: T/ {) b8 z' B/ z
    [backcolor=white !important][size=1em]PHP code
    6 T7 ?# M' T/ k1 E- M
    [color=white !important][size=1em]?
    1 m7 {% ], y; R6 P# x7 s
    [size=1em]1

    6 B% N2 f4 ~/ Y! \5 F7 V
    [size=1em]2

    1 m/ h1 P& I/ `
    [size=1em]3

    $ h% G5 D# t6 }
    [size=1em][size=1em]Base* pBase = new Base();  A4 r$ Y, J* h
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    $ r! L& G; W3 d0 n" j[size=1em]pInterface1->func1();
    " a$ I( o" }- h0 ]  G' R
    + c2 B5 k! U2 ^; l
    1 y7 z" |7 W( {

    - C; M: M. z( ~5 K( P+ r2 {( A, B0 ~; Y& \  k' c, R5 q4 z/ k

    $ c& j1 V& t* y) l8 _) [' l2 c6 T
    2 \! T- X9 _' {* ], WC++编译后,Base类的虚函数表如下:* `$ `; ?- N4 X  ^2 w
    [backcolor=white !important][size=1em]PHP code
    & g6 R/ C! H% M; ^# u: D- `4 Z
    [color=white !important][size=1em]?

    ) D. B5 i6 Q( ]9 x8 ?; L
    [size=1em]1

    4 ~. @& X. m& N  i
    [size=1em]2

    * W" z. W8 D8 l: z
    [size=1em]3

    9 |& k3 x' l* H/ s( Y
    [size=1em]4
    $ e: c2 p5 S* \8 F! m; c
    [size=1em][size=1em]  2 c$ z6 P$ P  q, p- H& o6 K" Q; w
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    2 T3 ^$ [% |! }9 I2 O[size=1em]vTable:InterfaceU1 |Base::func1()|* B2 n. X- v/ S
    [size=1em]vTable:InterfaceU2 |Base::func2()|# Y+ y0 v$ s7 \. t; k- e: @
    5 w: x4 B: R+ N" W
    : {/ m! h! o; b! i& P! s* d
    6 [( i% Q3 R9 n. D# V% H) y' y! `
    2 Z, ?9 d+ l0 K' [6 P. i: J, i
    % m) @0 M: L/ x
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。! G2 U6 I9 b- ~( F1 J/ O3 y
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    # J; R9 t. v! ]; C+ ^& x' pC++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    1 C- T# R& ?( n, i! ]# RC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
      q8 {( d9 b& K: `" e# v
    4 H- @8 j0 Q/ ^3 q- B1 J
    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-3 23:34 , Processed in 0.479098 second(s), 53 queries .

    回顶部