QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2115|回复: 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]class4 A% w9 t, i0 \% f* X8 }9 U
    [size=1em]    InterfaceU1; \% J! N! p. ]$ Y% J7 Q1 c% q9 t' ]
    [size=1em]{, z" [2 v# V; {: E* k, t& D
    [size=1em]public:+ ]% N: D4 |( E  W" y( ~) C+ N1 L6 N
    [size=1em]    virtual void func1() = 0;
    0 S5 k: }/ B, a[size=1em]}
    ) F6 }# u* o- E
    ) Q5 w3 F8 r) |6 \3 c) \[size=1em]class3 R9 _6 X3 k- R, x8 c4 p
    [size=1em]    InterfaceU2# ^1 q3 a+ ~7 {5 u- U
    [size=1em]{/ U2 Q% y& u+ L& \) l2 I
    [size=1em]public:
    0 u7 |  z* D" n& c' X4 s# I[size=1em]    virtual void func2() = 0;
    , M5 ~7 m) s& o5 [& k/ N; q* b( O[size=1em]}7 L9 I, ?$ t1 s

    2 F9 e% h$ D, V% F' U$ C3 y; _[size=1em]class- P. g! t# u' [8 Y+ c  n
    [size=1em]    Wrapper
    * z2 i) _4 U9 b& N8 q+ |[size=1em]{
    ) g: ~3 C, `! N$ y  B$ U1 y[size=1em]public:9 f+ @. `# [. Q8 R6 M, D. V
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;: c: [1 Y7 c$ \- x
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;
    + E8 f* I4 j& M/ x$ I+ b[size=1em]}( D/ j: I5 j$ m6 Q

    $ U9 M* Q2 C4 _, t! Q[size=1em]class
    8 A+ y7 R2 E" T" u[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    * `6 e9 n  }2 R4 L( X[size=1em]{
    7 Z5 i! C* P- T  {8 w[size=1em]public:
    . ^3 I6 J* l- n! D9 D[size=1em]    virtual InterfaceU1* getInterface1()
    " s: A7 b4 t3 B+ _4 T: z* |[size=1em]    {
    + |2 [  z1 W" o' j[size=1em]        return this;
    & x: k" n. F% i$ s[size=1em]    }
    - `) ^# |) z2 l. |6 V  N7 u$ o4 g[size=1em]    virtual InterfaceU2* getInterface2()
    + a: |' a" P0 M+ I0 g  ]( t6 B[size=1em]    {$ h* V2 j# l6 a% o9 @' Y
    6 g! b+ S' r$ p* Z9 S
    [size=1em]        return this;
    1 G9 ?) Q$ t: B* M0 D: v. ?[size=1em]    }
    : S7 n0 D( K- N  @0 ^0 D[size=1em]    virtual void func1()
    ' [" o) J" ~" n3 C+ L0 W8 R& H[size=1em]    {( U2 K1 y' ^( @& O
    [size=1em]        printf("%s", "func1");
    % i" [9 ]+ \8 {" u[size=1em]    }' n- ?' I: Q( U+ o
    , z8 m3 \. ^* s" J4 s+ `9 u
    [size=1em]    virtual void func2(): G% P9 |8 D. s, K/ _
    [size=1em]    {7 H; H; c2 N, ^$ q$ h: i
    [size=1em]        printf("%s", "func2");
    $ g2 s# l6 T0 w% g' B/ y( P[size=1em]    }) a/ L& w) A: n, @2 M0 z
    [size=1em]}
    5 a1 t: s  ^# B& x& K9 A9 n
    $ H' c" f9 B, F! ^# d3 H

    + \% a8 Z/ n1 u3 q

    $ d5 W3 B0 E5 \7 x+ a- Y0 @# |# M4 g/ A" A! L9 k' U4 A6 X
    假设有如下代码:: T8 }% J. r7 C
    [backcolor=white !important][size=1em]PHP code
    ) \0 ], ~7 `0 M4 q4 h: n
    [color=white !important][size=1em]?
    3 L1 D" B% `/ ]; J. b
    [size=1em]1
    , r( A) l4 Z8 _9 L$ R2 ~) s1 _
    [size=1em]2

    3 Z$ o; H" P& i
    [size=1em][size=1em]Base* pBase = new Base();9 P; d8 M- f" p  K, g
    [size=1em]pBase->getInterface1()->func1();
    + m' R4 A$ S- l. Q" c7 O8 m7 t% R  G" `) B# v7 D( c

    2 C1 x( O. v  r0 W
    ( F! H* `/ k5 J# A* u) q' A
    - z& D/ l% K9 n& X2 D) `+ \( H其实以上代码等于:3 _% L! C1 A: J3 X: D
    [backcolor=white !important][size=1em]PHP code3 K/ z+ C: |% g, |2 P2 j6 a5 e
    [color=white !important][size=1em]?
    3 {+ J1 o% P& n: d( E: h
    [size=1em]1
    . B! W  j0 `) Z1 r
    [size=1em]2
    6 T2 Y' Y4 f/ {, i
    [size=1em]3
    ) D0 ]& T! D' E* y
    [size=1em][size=1em]Base* pBase = new Base();
    2 a0 ?. y1 X: }; J  ?; }4 E1 v' w[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();4 }' a% o0 Y  \  Z/ {( F
    [size=1em]pInterface1->func1();
    ' I& X+ Q) \! U
    * I1 m% c- S, k% V. r' o

    , l7 `7 t; K* d: X2 \
    + Q1 }! J) A) ^6 \7 k5 o* o. N, d+ o4 Q5 ^$ }& a5 u

    & z8 T; Z) k$ r" t9 |
    * R; [8 v4 o5 w. |- _; k' p+ sC++编译后,Base类的虚函数表如下:( d8 d! B' u( m4 K2 Q+ w
    [backcolor=white !important][size=1em]PHP code
    . ^3 {/ d/ |" x! Y" y8 E% A1 g
    [color=white !important][size=1em]?

    1 ]: F& k! S% F- P; c' H
    [size=1em]1

    # B0 ~& r, {2 {2 V
    [size=1em]2
    , O" N, F1 D: c& M$ a) m% q
    [size=1em]3
    1 D* i  \# u5 c$ r
    [size=1em]4
    " Q' M1 h. o& o, H
    [size=1em][size=1em]  
    ; w& G& |" ~5 N[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    9 B) u! w0 E) y6 T% i* J+ S[size=1em]vTable:InterfaceU1 |Base::func1()|! D: }& z3 d; Z4 I5 v5 H% [% {# [  R
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    4 I) v1 h, U) v3 ^1 p4 V9 ~+ E2 M4 p" D! W' v& Z9 G
    : @, [$ w, F& C9 A7 d: T
    " X. w0 L- y  h- {1 O; T

    8 t8 N: H& `9 U- r: J
    + A" ^0 O8 J# g  X0 a+ a如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    8 V& i3 [8 k$ s. {" C$ b2 a+ S但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。8 R$ D% W" D& Y1 C8 j1 x+ P
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?3 K; F5 D2 N4 g! D" d
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)4 K7 P, F1 e& c4 J! v* b% v9 T0 A

    0 {! z4 V3 L1 X; B- x: c
    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 15:16 , Processed in 0.373928 second(s), 53 queries .

    回顶部