QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1740|回复: 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 u# G. |4 }# A# u9 M7 c7 j# c
    [size=1em]    InterfaceU15 t, g& Y; y. e, i( [8 e% f
    [size=1em]{4 v9 \/ _4 {  q7 e
    [size=1em]public:) o3 ^- e( U2 g0 Q  G& P
    [size=1em]    virtual void func1() = 0;9 c8 l& R5 _4 v2 S- v
    [size=1em]}
    " ?- a& d- }! \# m' m) S. d! V* X; H7 X7 S8 R
    [size=1em]class8 }- J. [& z% C: H# }! ^, Q
    [size=1em]    InterfaceU23 }: Y9 T3 h: ]# A$ P. A: V% y4 d  w
    [size=1em]{
    " z9 ~2 }3 ?+ L2 a, D3 q; J! G[size=1em]public:0 |$ N) X. }& E4 v) [0 r
    [size=1em]    virtual void func2() = 0;
    * Z0 @4 {9 f9 a4 A3 w[size=1em]}! k6 a: `' Y( v7 e$ c

    % z  }8 C7 L$ D4 w3 E[size=1em]class0 z, v# s" W8 c
    [size=1em]    Wrapper4 t4 g: _+ o$ Z8 S2 r
    [size=1em]{  `, A1 n& x8 y  ~! w5 m; {
    [size=1em]public:
      ^4 @" z& o* M) ?3 A3 z[size=1em]    virtual InterfaceU1* getInterface1() = 0;: |% M: v1 g5 ], K1 Z
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;; d  h5 {& T7 @4 |2 }* @
    [size=1em]}! S8 @: x: D) Y/ }
    + @. Z  ]8 x( e. m
    [size=1em]class
    9 r1 w6 h# G  S. d2 U[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    + n' N2 j% J8 f0 b/ E2 g9 o$ m[size=1em]{( f" t: z& N" q4 H% e; s5 L3 q
    [size=1em]public:
    0 l& s0 Q+ W; d0 D8 ^5 G- P[size=1em]    virtual InterfaceU1* getInterface1()
    - h5 [7 M; F% _# X( ^% u[size=1em]    {
    " X) K5 |+ p9 O[size=1em]        return this;4 m% P! \3 X" S1 ^/ R$ [
    [size=1em]    }  M( ?0 ]% ?3 Z% P7 C5 F
    [size=1em]    virtual InterfaceU2* getInterface2()" ?0 z$ U8 _: |/ A4 x4 Z5 t& F( b
    [size=1em]    {9 `" h( B% B8 |4 Q/ J
    3 v% B) M7 q2 v7 {. I9 c
    [size=1em]        return this;
    & {- N, u& v2 ~[size=1em]    }+ `  i# s9 d2 R0 A
    [size=1em]    virtual void func1()
    5 h  Z% }+ @# L8 d+ R[size=1em]    {
    ; f- ?3 V+ O5 g[size=1em]        printf("%s", "func1");7 _5 R5 e! r5 R' T6 c( i+ N
    [size=1em]    }5 Y0 A7 e' u, g1 Z) u5 D% K! @

    $ w# h$ m, g7 K5 @[size=1em]    virtual void func2()! E; b& H' i/ X2 P
    [size=1em]    {+ y9 x: N5 Q6 Z8 o: t5 y
    [size=1em]        printf("%s", "func2");
    * h' i( d: h5 R1 ^& f# [3 B[size=1em]    }
    4 x& G: g0 t/ `( j; U: W7 w1 m/ q[size=1em]}% V, j4 Q  _) r8 C

    " }9 L6 ?7 J9 [: V1 a" ~' |

    - Y! \) T2 X% f: k# k+ a
    ' c. p5 I0 \5 {6 Y9 {

    8 {# s+ {' ?9 n假设有如下代码:
    4 @9 \% a% t3 [# C[backcolor=white !important][size=1em]PHP code1 H* f) c$ v7 R- O) Y. b7 u/ M
    [color=white !important][size=1em]?

    * r  A2 t7 H% s
    [size=1em]1
    / Q. S; a& h; m2 d+ H( u& A: L
    [size=1em]2

    " W/ j8 H2 W* O
    [size=1em][size=1em]Base* pBase = new Base();, x; F) N( @; u4 P. [# O' C0 v
    [size=1em]pBase->getInterface1()->func1();# p6 r, l3 S! a% `+ V
    0 q, n, d0 U& F
    ) x' v) o1 y: M. s

    4 v) Y' ~2 y; C# z/ e
    5 J8 J4 z& y  ]8 K1 i; C' ?其实以上代码等于:
    + R6 R- ~. @2 S3 o: R) A+ _% D; b[backcolor=white !important][size=1em]PHP code. @1 B' u* P  d; j
    [color=white !important][size=1em]?
    , t5 w5 L" c+ |( @$ f
    [size=1em]1

    # A# I, ]* `$ F# u% T" ?& w
    [size=1em]2
    ; q  @# c: y% O% a1 p: u# z
    [size=1em]3

    % ^& _' X/ f" B+ t* g+ [& l
    [size=1em][size=1em]Base* pBase = new Base();
    3 Z8 y# @' ], Y- C# p/ g[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    ' \/ g% {  Q3 I0 c; ^& }" \6 O[size=1em]pInterface1->func1();
    1 K" v6 k5 {! s' ]
    6 ^3 B! N" k5 m! P3 L
    ' S  g, o8 q1 A

    3 }3 c" z" T) u
    4 ^- j) \; C8 O; ~+ l, {7 W/ O$ ]- j- A2 j
    1 n' |5 V8 Y1 N! t
    C++编译后,Base类的虚函数表如下:% F2 c+ e- Q7 R  d# `' p' E+ p
    [backcolor=white !important][size=1em]PHP code% B( q5 ~; Y0 v9 q
    [color=white !important][size=1em]?

    # o6 V4 s# q5 p, r6 g5 s8 l# B0 h
    [size=1em]1

    & \, U& D: s' q8 e$ j; o. s& `" i/ Z
    [size=1em]2
    3 l$ N# Z& \  m5 o5 ~
    [size=1em]3

    , j  h/ v5 K# |
    [size=1em]4
    1 x4 z2 f! `/ J
    [size=1em][size=1em]  
    - N( `* j* v0 E* T5 ~. j( a* \+ f[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    7 H' g  r9 W- \, s[size=1em]vTable:InterfaceU1 |Base::func1()|
    ! Y# N, B1 `% @[size=1em]vTable:InterfaceU2 |Base::func2()|, i7 H. Y7 y$ s0 V* P0 K

    5 [. ~& ?6 m- ?! {3 Q! C: d$ _# Q
    . t, S4 r' s9 Y6 n. k+ l" K4 p

    7 L& E' R. k( N+ [6 v2 E3 U" R' b5 i4 J

    % P- o$ R; t/ O( s1 g; r如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    1 A6 v$ e& h5 |4 }8 z! a/ u但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    5 _9 v! q6 a0 bC++是如何得到当前应该使用vptr[??]位置的函数地址呢?6 n- A$ P8 r; Y8 Y# L2 b
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    2 y5 b0 @7 m" ~& ~5 }% s9 i
    3 E" o8 B' s9 E4 i  e
    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-19 06:47 , Processed in 0.533673 second(s), 53 queries .

    回顶部