QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2043|回复: 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
    , S4 i3 Q$ ?/ x) i* p[size=1em]    InterfaceU1  |- T6 D$ ^3 I- ]0 D9 j: }
    [size=1em]{
    6 |+ h  ~+ H! L5 \5 B4 ~+ s[size=1em]public:
      }5 G! s& V+ g" ~/ g: V& G& J3 p+ o! \[size=1em]    virtual void func1() = 0;: e- D  L4 f8 U) y4 f3 ~3 V
    [size=1em]}1 a+ c: P3 v* u$ Y' x
    ' E, l: E" ?5 r& [9 p: k
    [size=1em]class2 B/ h# b5 ^4 N& k& A
    [size=1em]    InterfaceU2- ?& F" j4 L' P# `9 n; \: Q
    [size=1em]{
    7 F$ I, G6 J+ f[size=1em]public:5 g; h+ x% R, s0 T9 X6 t
    [size=1em]    virtual void func2() = 0;
    ' A7 d- C0 s; T! V[size=1em]}
    # Q) O2 s* K- y0 a6 N! X; Z8 q
    3 A* L! D" O) }) J# N* N3 e[size=1em]class
    " D# z8 c+ F# |; c. t" a: [5 k: u# c[size=1em]    Wrapper, H. v1 L3 ^* Q" A
    [size=1em]{( k% f$ f) D. i8 |; h% W
    [size=1em]public:
    5 b( b2 n* c6 i# @[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    , N, D) f, X; B[size=1em]    virtual InterfaceU2* getInterface2() = 0;% R$ t, ~$ `. D/ n" m& ^6 m
    [size=1em]}3 F& p0 b& r! ^8 |- g

      d0 y7 ^" Y3 ?3 K& t+ b[size=1em]class
    7 a* Z$ A, J! r5 U" ~5 P, `* ?[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    : ?1 R( n2 B+ H: V$ N[size=1em]{- Z  m8 }9 F' ]4 c: u) I
    [size=1em]public:
    3 b, G1 U9 r! ]" ][size=1em]    virtual InterfaceU1* getInterface1()2 P( _7 u5 |' e: h# G+ e" _
    [size=1em]    {9 D; ~2 `# ]  C; g, Q4 ~7 Y
    [size=1em]        return this;
    6 C9 C  Q, p( Q[size=1em]    }7 x2 n+ d0 F1 ^- U0 U3 U
    [size=1em]    virtual InterfaceU2* getInterface2()! _* R: |* D+ A" v% ]8 v$ x3 v. F
    [size=1em]    {5 Z! K1 T: B0 K" ~9 v: u5 i! N7 E" P
    + T, J5 |! Z* c' G: Q) p
    [size=1em]        return this;& [- g' ]) j0 Q2 V! {
    [size=1em]    }1 M0 v* }9 i8 J6 W# ^
    [size=1em]    virtual void func1()* A( h; y- `% R# p
    [size=1em]    {
    # A% [: R1 j# M- p, H: P3 x[size=1em]        printf("%s", "func1");6 _3 r, _2 }) t3 j+ k/ j% d
    [size=1em]    }; ^; D: V0 @# L

    1 s5 G& u7 {, I) y! f[size=1em]    virtual void func2()
    / V% q4 @8 j. e4 N- r- _[size=1em]    {
    + P6 N% l, \* x: g( I0 p8 {[size=1em]        printf("%s", "func2");0 L/ K8 }7 N1 }2 d" T$ N
    [size=1em]    }
    3 ~+ Z1 Y& f+ {* M: A: [+ i[size=1em]}
    8 U9 r* [* C3 y7 ]& l( x4 _( u3 ^
    5 \3 R/ ~8 e1 W7 Q" D; H7 ^

    / W' H* v1 G+ O6 ^) N
    ; U  h5 Y. |2 J. |" g
    # [; F# V8 u8 }/ R; U# y0 w. c, T1 k( N$ M
    假设有如下代码:
    $ \/ B% S7 _4 t4 b[backcolor=white !important][size=1em]PHP code1 Y' f3 Z3 r" h5 `  e# S
    [color=white !important][size=1em]?
    7 O1 U3 j; f9 Q  a$ h' }0 j- G
    [size=1em]1
    2 N6 }( ^# k* b; k
    [size=1em]2
    ) f% e9 m6 I- W, G
    [size=1em][size=1em]Base* pBase = new Base();" k  _  {/ Q& ?, {
    [size=1em]pBase->getInterface1()->func1();) E0 }2 B; z' \2 \+ H

    . B; ^# [: g5 d! g
    - A9 M) G" G" t3 Z
    . f0 m+ w  r1 J& {0 |8 P

    " W6 ^; }7 w2 F* ]其实以上代码等于:
    ( M$ e) s' q3 u5 O0 Q$ V[backcolor=white !important][size=1em]PHP code
    ' e$ J  w, B1 Y& X0 f$ Q
    [color=white !important][size=1em]?

    9 q& y) V8 x+ C/ }
    [size=1em]1
    / D* H& [1 g4 F! ]; F" }
    [size=1em]2
    , |6 b2 a" d7 o% z
    [size=1em]3
    ; o8 s/ n5 Q3 ?4 L2 O+ I3 i, p$ B
    [size=1em][size=1em]Base* pBase = new Base();! @9 y$ F; j  f
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();! z9 K' h8 ~1 m1 z, l6 `' P
    [size=1em]pInterface1->func1();# n- b6 B  s3 h% i1 I% e8 N

    % P6 d6 n# }: `0 }  c6 v
    . i" V! X: R& I' b2 ?

    8 O. z3 ?3 J' M8 b" y1 {
      [  \8 h! A  }$ \; V6 d  M
    ) i! I: M% D. L; ^2 P1 Z7 O% c
    - h) w& S& U8 S2 R% U+ jC++编译后,Base类的虚函数表如下:
    ! t8 K6 X/ g; S, F' I5 E- f[backcolor=white !important][size=1em]PHP code
    ' y( t. t1 t7 \
    [color=white !important][size=1em]?
    5 o! c/ d/ p1 J% g% d
    [size=1em]1
      q- U# q' a7 ?8 v4 E# t
    [size=1em]2

    / O1 K) y( z  s4 N- T6 z
    [size=1em]3

    : b9 ?/ F) c6 e: `7 a: D& B
    [size=1em]4
    9 q1 H8 ?1 h6 o/ m, I$ j
    [size=1em][size=1em]  ' X0 k7 \8 U# R* U; {3 ?
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|" H  t! I! x# r6 b/ I
    [size=1em]vTable:InterfaceU1 |Base::func1()|% h' e+ o0 c% B, Z4 {1 v- y2 H' M" j
    [size=1em]vTable:InterfaceU2 |Base::func2()|! S) P6 x4 f% e
    1 N$ n. ^5 S9 T
    4 t) a9 X/ ^- E. x, X; F6 ~
    7 v$ X8 t5 V: X  w) a) f) V

    $ i% ~# ?  V+ g" T( O9 h2 h
    1 Y. D/ C0 G' H- I- c. t  z如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。7 r! p- W" ]2 J  W1 ?* N1 N
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。: c# Y, z! J" [% K' t
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?3 u9 [# L  F$ g/ U9 q. D
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    ( f+ h1 }* D# b5 |- _
    # Z! T8 X, @8 C$ L* M7 q
    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 23:14 , Processed in 0.440229 second(s), 57 queries .

    回顶部