QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1757|回复: 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]class3 ]5 L/ j+ `5 V( ]( J! c' }# l/ p
    [size=1em]    InterfaceU1
    4 k/ j% S2 Q0 t" [1 N; l[size=1em]{
    ! [2 J% S6 R: T* |5 i  R[size=1em]public:
    ' ]$ S3 n! [* K9 p3 T9 ]: U[size=1em]    virtual void func1() = 0;1 H( @/ o- Z0 ?4 F9 a
    [size=1em]}9 ?6 ]# G, ~* V
    # C' C) I/ P5 `
    [size=1em]class
    2 ^# L; X0 Y7 w1 u1 c3 k2 y[size=1em]    InterfaceU2
    ( C5 P" \0 v6 H% S[size=1em]{* n$ ~' T8 O, y3 _3 Z$ L" L: l1 r
    [size=1em]public:
    ; M7 s! ]+ l; P. l: b[size=1em]    virtual void func2() = 0;) R9 R7 w& ]7 }6 I7 i
    [size=1em]}
    # O2 }! Y! S4 V: z
    / F1 d$ A6 C8 ~. A- \4 b: u[size=1em]class
    1 E% r; p( c% W# C( J6 |[size=1em]    Wrapper
    9 J" m8 y$ K6 z+ [( T/ O8 Y: i) k$ E[size=1em]{
    ( V* n/ W  _! ?' Z* Q6 F  v8 n7 F[size=1em]public:1 Q5 Y8 K2 V! ^# ]% I/ @8 N
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;
    ( W( N8 ~1 r2 [. m; }; s[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    1 f# C7 E) G; r) {! q; K, O2 E[size=1em]}
    ! Y% s# v$ g2 Y1 C+ R( |8 K% S9 w; b7 s, X2 {2 S# ^& r* e6 ~
    [size=1em]class; ^5 e4 P' {" F# c9 C0 x
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2  B* \3 I/ q9 g) ~+ j% G( Y3 B+ ]
    [size=1em]{
    . ~0 y$ j8 @3 J. w+ ^4 N. f& e' u[size=1em]public:' K: |) K% l; a' A: L% T
    [size=1em]    virtual InterfaceU1* getInterface1()
    6 G' A+ U5 ~7 H# `[size=1em]    {0 `8 F# r  g  y+ k% C0 v
    [size=1em]        return this;
    5 v2 N! J' p. Z7 g- c[size=1em]    }
    - W& o: s9 B; G& Z( T[size=1em]    virtual InterfaceU2* getInterface2()
    4 {! W) j* ]# M3 a[size=1em]    {4 H/ z0 z6 V* \; ]% e' w

    7 f( _% g8 {" o, c$ a4 ^[size=1em]        return this;* x  g! p7 N: R0 k/ ^
    [size=1em]    }
    ' G- c; A# Z, x% s7 Z- Q[size=1em]    virtual void func1()
    1 t$ `# h* o* T/ c5 C[size=1em]    {
    6 r9 W3 w. P( O* @7 i6 M5 }[size=1em]        printf("%s", "func1");
    8 }" {8 H; Y6 n1 ]% B[size=1em]    }
    : @. C, x  r+ c" v4 n) A! i4 C' S" r& ?' F; n; z- z
    [size=1em]    virtual void func2()
    - y( `# B8 ~7 t6 `  h1 O[size=1em]    {# k# i8 v1 t0 N+ Z. e
    [size=1em]        printf("%s", "func2");/ U8 r1 R" D2 J8 ]1 ?4 ~: b5 M
    [size=1em]    }
    2 o( B1 B) V! d7 K& L  ^' [[size=1em]}! l. C3 J" P1 P1 p8 h' s6 M

    . `& V5 V; R' ]

    + T1 a* i3 k' l7 ?

    & O, E; ?: i# b& a) v* k: C& Y" {7 u
    假设有如下代码:
    # u# T5 k( K7 A/ ]2 H[backcolor=white !important][size=1em]PHP code
    $ B4 j2 B4 u3 I6 ?
    [color=white !important][size=1em]?

    , l& S& g6 x0 U1 H, G7 `8 P$ S
    [size=1em]1
    ; H8 V; B( P4 M0 ?" ?
    [size=1em]2

    5 F: z; ~9 @" ^. y
    [size=1em][size=1em]Base* pBase = new Base();& a0 \, ?) j" i
    [size=1em]pBase->getInterface1()->func1();4 @* t: C) F% a: X- u, s- K
    8 f& {# E; \5 `+ v$ ?" G4 Z5 N) }

    ( q2 r9 y+ ~* U, ~& u, ]. M  B+ f2 c, x3 K. I% O

    % D7 @& w  x8 V; E1 G7 Z& {其实以上代码等于:
    & |, ?; W" p5 ]4 @/ w2 I[backcolor=white !important][size=1em]PHP code
    3 T* k$ z, V' `6 K) E
    [color=white !important][size=1em]?
    * Y8 o: N# t0 T2 P, |
    [size=1em]1

    ; k3 m" Q: k' B/ D/ a; }+ Q
    [size=1em]2

    ) u. e. ]) ?: q+ D
    [size=1em]3
    , D: k; r) v% f% G9 m
    [size=1em][size=1em]Base* pBase = new Base();0 Y% {0 D- E; v5 E: A3 I8 U
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    7 O0 \- w$ O2 X" N5 g[size=1em]pInterface1->func1();; {; I/ Z9 y9 v3 `, V$ z# b
    + o0 N5 \3 `- H9 }) i
    : G- T& j) U4 [; m3 P
    & z. B3 C1 ^; O" W$ j4 W/ D# R
    " R2 g! d0 x! c  ^9 c) P1 P

    & k0 M* P% `8 d7 G$ [
    / k/ a# {& i0 e8 ~C++编译后,Base类的虚函数表如下:( y6 L/ x6 V8 D, J
    [backcolor=white !important][size=1em]PHP code) U5 h! J+ `; w9 v
    [color=white !important][size=1em]?

    * h+ U* q8 I0 ^! q# V& X, ?
    [size=1em]1

    - ?# L7 [1 H7 X2 @! {) o! o2 e
    [size=1em]2

    ( I% Z/ [& t3 g) Q
    [size=1em]3
    2 G/ y- D2 ^6 L; b
    [size=1em]4
    ( v/ b7 p  Y9 |/ Z1 s
    [size=1em][size=1em]  + x& U  n7 I7 S% n! o# G+ k; I
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|4 ?8 {) L; P/ s, h+ C4 @: y
    [size=1em]vTable:InterfaceU1 |Base::func1()|
    1 g3 W3 I5 F- D% T9 K* J5 C+ T[size=1em]vTable:InterfaceU2 |Base::func2()|% [) V' ^& ]5 C2 h$ c% [
    2 u! J! _2 D3 S  ]" J& F, \; |
    , b& z& f) b9 S4 D; I. t

    2 P/ s. J, s% I+ I
    4 z5 I, F' O7 M( Y, x6 H  ~/ j) |
    . t+ s) ?  U6 w' D8 F8 K+ n* \如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    & T  K8 A; |! ?+ {5 [( L" Q5 `& }, l0 |但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。+ T& W/ h9 M! v9 @
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?$ o8 z3 }, d0 v( R; S1 d
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)7 B1 W- F1 e1 v1 B- G& W$ x

    ) `. m; Y$ z  b* t1 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, 2025-8-27 10:10 , Processed in 0.562719 second(s), 56 queries .

    回顶部