QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2042|回复: 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+ g# }1 A9 i. ?
    [size=1em]    InterfaceU1- Q5 T9 g* }6 f7 A" B" I. q
    [size=1em]{
    / s/ y: ]( q" i, }, u[size=1em]public:, ]. N6 O$ [9 s4 r2 @7 v! {6 }
    [size=1em]    virtual void func1() = 0;
    5 M' R1 g. r; a7 t[size=1em]}8 v" {" }7 Z' r
    1 J- u$ f% X% N* B
    [size=1em]class' t; V6 A; a( ~$ B
    [size=1em]    InterfaceU2# D2 B& N3 H3 Q8 [) T
    [size=1em]{5 Y, F- @! X- w
    [size=1em]public:
    . E4 G/ b' Q- `; T6 K  r* g' r/ V[size=1em]    virtual void func2() = 0;
    # q; q) y+ P" j$ N8 ?[size=1em]}0 I" N5 u+ I5 }
    * G* l; ^4 F4 o- ^8 l8 A3 s
    [size=1em]class! k" r+ p$ M8 [8 U1 K9 y* o6 y4 R' _0 q
    [size=1em]    Wrapper" F, P: W" }1 K6 H
    [size=1em]{
    : c/ e7 K% F4 X% B- r1 F[size=1em]public:6 c! {3 e0 L6 N: X
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;1 |& z7 B: T9 Q# Z( s5 q
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;
    . K- E5 r; B7 S' Z' j0 [6 a[size=1em]}$ z8 L3 |  S! i5 u/ g$ ~

    ' m4 ?7 A' ]% ~" H9 O[size=1em]class
    % a5 Q$ L6 F% ]) U- p" }  D9 E: `[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    / M) A  K( ]* O1 m- Q4 z[size=1em]{
    8 Q, Q. E4 M" T4 |) ][size=1em]public:
    3 j2 J  k( Y2 ]' i, T[size=1em]    virtual InterfaceU1* getInterface1()* m+ i: L$ g  m1 Y8 P* V! Z
    [size=1em]    {
    0 M1 W% Y. w: P8 W6 @[size=1em]        return this;5 \% B- H: x. \9 t
    [size=1em]    }, E% }0 j6 E5 [0 V0 x: ~8 {: X
    [size=1em]    virtual InterfaceU2* getInterface2()
    " b. k; m2 y& b0 W[size=1em]    {
    3 z, r# ?. ~6 Q( f  o5 e; \1 w, n
    ! w; l5 Z% N7 N9 U: m; X[size=1em]        return this;+ t+ F4 K# k. r
    [size=1em]    }
    ' k, I: n' ]( \5 B! S; U. ~[size=1em]    virtual void func1()2 m) d) k5 V6 f
    [size=1em]    {
    ; _# g" T/ |! N4 \[size=1em]        printf("%s", "func1");
    0 a6 I2 z$ [) a/ @( f+ u! G[size=1em]    }) @% i1 M/ h8 L, C) Z# C# x$ R
    6 g) ~2 U0 ~, K4 {1 _3 [
    [size=1em]    virtual void func2()% K. _7 V! e; i/ m( T$ Z
    [size=1em]    {$ Z$ e* Q6 c5 j  ?
    [size=1em]        printf("%s", "func2");9 I. l1 J6 b, [# Z: \" J
    [size=1em]    }
    + q/ ^  o& T/ Z4 X0 _[size=1em]}, z9 R$ ]1 h6 n! M; Q( l, \, S

    : A2 T( h7 Y. `* i
    # @3 L7 }& K9 @3 b/ o2 }" j' v: t

    , u$ K5 v  n& c. N$ E# M& j5 I7 Q  D: c
    假设有如下代码:, A9 y& t' U. k  r, r+ B
    [backcolor=white !important][size=1em]PHP code3 U+ p, ^4 P% a* H0 F7 e! L
    [color=white !important][size=1em]?

    ' F" R* b0 d* X) P7 y- i8 G
    [size=1em]1

    * M" r$ P- ~% b! Q/ Q
    [size=1em]2
    6 _+ s, d6 w) X& p3 d4 k& f1 _
    [size=1em][size=1em]Base* pBase = new Base();$ Q" F$ Z' m7 Q7 _& R
    [size=1em]pBase->getInterface1()->func1();
    " b% \6 ]9 `' O& {6 k# |+ x% e. o$ j3 M0 H5 E* G6 P
    7 w, g0 B- G8 x& ]9 i9 ~: M9 |

      Y: `3 v9 f9 O9 C
    4 d; n  j" M1 s% S, v其实以上代码等于:
    8 ]$ ?, E2 h* B1 V4 `6 Z[backcolor=white !important][size=1em]PHP code
    4 o/ e8 v1 c0 f, }) Z
    [color=white !important][size=1em]?

    8 q! L/ z) p- a; J7 v
    [size=1em]1

    7 x% n# X3 w2 P4 p: G
    [size=1em]2
    . b; ?/ ]5 T5 h; J
    [size=1em]3
    + [8 X8 a5 A/ i- `& i7 C/ {" N
    [size=1em][size=1em]Base* pBase = new Base();
    : x, a3 V- s& X$ i[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();# R( J! t0 l$ V" v& Y$ N
    [size=1em]pInterface1->func1();
    # V9 V0 X. H7 L1 f; E) K1 {  s& W, S1 v, y, k1 M0 h

    " j6 I9 l% x' l0 k2 G4 e: z. Q2 Z5 e! k0 b

    2 B5 H# ^$ }, T% Q) d, ?! k4 t+ c$ z# z9 b7 A. w. ]
    4 f8 ~6 `2 W+ |4 f
    C++编译后,Base类的虚函数表如下:# ^4 A" ]+ w1 u3 \! C
    [backcolor=white !important][size=1em]PHP code
    + d& H  l; [5 O# W3 [2 b7 ~
    [color=white !important][size=1em]?
    & g1 C3 \7 h; y
    [size=1em]1
    " I9 Q) [: V8 @0 T( g2 z8 g2 G4 K/ I
    [size=1em]2

    ! W6 j5 {- V* {; ~/ X# u# a
    [size=1em]3

    ! q. d" F5 h( ]7 H! I" e" M
    [size=1em]4
    , L0 L0 w- g8 o( j, o  E
    [size=1em][size=1em]  7 |3 U( j% z$ V; y8 }
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|! i* B' H4 \8 e
    [size=1em]vTable:InterfaceU1 |Base::func1()|
    ( d$ f8 ~9 r2 w7 B  x* N6 o[size=1em]vTable:InterfaceU2 |Base::func2()|
    # R9 G5 u# ~7 B/ s( f7 }" q; u  R5 w2 [, h6 @

    0 _4 r* Y7 K1 J7 Z1 J9 I: \- J: ?. a! q1 @; q

    ; y6 _/ P1 g9 h4 Z- m# Z) ^
    4 {9 D9 A+ ~1 @/ L/ Q如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。2 y* |/ n4 n  w$ N# U
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。3 u( V2 A. ~" W7 a& r8 ~( N9 F
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?: \# H1 Q% ]- P+ w4 q4 Z: Q/ {
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    6 p+ U$ x$ n: A$ r' |6 f8 S! h8 T/ D" o9 q4 ~* 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-6-16 00:20 , Processed in 0.416130 second(s), 53 queries .

    回顶部