QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1736|回复: 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
    2 y' K- `  v5 p# \. Y5 |[size=1em]    InterfaceU1
    / a& {- ]0 D0 r2 {[size=1em]{# J$ p$ |3 }: e
    [size=1em]public:
    9 N3 O4 E+ n; Y) w4 D4 _- O[size=1em]    virtual void func1() = 0;/ B0 n- y- L0 Q! `
    [size=1em]}* W8 T6 f* \2 N& N  }
    4 t, W; D; s/ E* q" e3 r
    [size=1em]class
    ; c) F6 p% c8 v[size=1em]    InterfaceU2
    7 r- m% K& {& X) a[size=1em]{5 O7 ~9 I6 Z+ d5 L' F9 w/ v* P
    [size=1em]public:3 v- C; g! s3 L4 a
    [size=1em]    virtual void func2() = 0;
    2 i! l5 C0 e- ~- H[size=1em]}( n# T# i' q* I& }: A9 F
    8 l; O" {8 C  t# M
    [size=1em]class$ H7 u) N  {! X1 j
    [size=1em]    Wrapper3 l3 b% W% N& ]5 J7 K3 O
    [size=1em]{
    9 y# H8 U6 m6 m; v4 A# c( r[size=1em]public:) o. K; Y- E7 {2 W, O  v2 H
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;0 Q% z: G& s. T5 c; @! R
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;2 J' B2 Z1 ~. q) g
    [size=1em]}% r& P0 {1 r5 I5 l

    : X, v' G7 _) K" L4 p[size=1em]class
    ; B3 Y2 x! R! r# y1 \[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    ( U" D% c1 g7 i# |( N; V[size=1em]{
    9 A" o% r' R7 M) N, V[size=1em]public:4 A3 x) I7 a# ]  g! T& W5 I
    [size=1em]    virtual InterfaceU1* getInterface1()# g. Y+ g) }% F0 Z$ V; e
    [size=1em]    {
    / V  c( T7 Z# u4 u/ w9 G6 f$ w3 F[size=1em]        return this;- D" s9 D" c& c; l: g) q, Y
    [size=1em]    }* U. L. @6 W' }- m- q- S, t
    [size=1em]    virtual InterfaceU2* getInterface2()
    # s% H# [* D! r[size=1em]    {
    4 l# _6 |' J/ s  [
      c& `4 g* s9 l; w; L+ b$ Q* M[size=1em]        return this;
    % r/ R9 r% Z9 L  Y2 z$ u0 o* o[size=1em]    }; g: b& p& E: ?& [4 [
    [size=1em]    virtual void func1()
    : U; A- f4 ?2 g! J& x) T" R[size=1em]    {
    $ X; U0 V2 m4 |! c, s) n& e; i[size=1em]        printf("%s", "func1");
    9 d, @9 K1 n+ y. K; b[size=1em]    }
    0 ]  d! {& {& a# Z' B" N  x- D6 U/ ?; _; q! O9 g: |; j
    [size=1em]    virtual void func2()
    & \' K, U3 r9 V% h[size=1em]    {! E/ p( K, ]  g/ M- h3 _' S, o
    [size=1em]        printf("%s", "func2");
    * r) o8 [  ?& N; s( A' J[size=1em]    }
    " [' c! @/ F8 @. X/ H. N[size=1em]}5 E0 l0 D* s4 f1 Y; Z

    7 ]* }% R* b9 [. `4 q8 N

      g* x. Z9 b3 d6 h+ p

    / s( C9 n! m- g0 i2 J2 O" a/ s7 F8 w0 S7 @- P- R
    假设有如下代码:! H2 }: W5 K) B: |1 M+ T* q1 W
    [backcolor=white !important][size=1em]PHP code" v5 {3 w6 x2 ~
    [color=white !important][size=1em]?
    + o6 d1 u8 D! Y/ V
    [size=1em]1
    + X6 b+ S$ U! ~% J/ Q
    [size=1em]2

    / b: c4 c/ A) m: m. i
    [size=1em][size=1em]Base* pBase = new Base();  a# p" }  B! K+ [
    [size=1em]pBase->getInterface1()->func1();4 v0 X. v' s. W6 O: u0 H+ o) s0 ?1 O0 o
    * b( M! o; f: P" [

    6 [# [* ^, m, V. Q8 ^& c, t: B( y  g% P: _5 {8 g
    + j, l; a4 z9 R0 \' N. j8 T
    其实以上代码等于:
    - A# n9 R- \$ P- {[backcolor=white !important][size=1em]PHP code+ k0 v. ^$ K/ a% X# O
    [color=white !important][size=1em]?

    6 {: P( L: s! X9 j8 ]$ g3 K
    [size=1em]1

    % K" K# F% s( a' `# A
    [size=1em]2

    1 P2 t  d+ o  o# W
    [size=1em]3
    3 O: r$ F+ |  a/ j6 o
    [size=1em][size=1em]Base* pBase = new Base();
    * J! ^. @& L1 d, J[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    . R1 W- v" D# j3 d  X[size=1em]pInterface1->func1();
    ! x2 y! S( \& w+ x8 A9 i! h2 x2 s3 O9 k# ^5 _+ P" E* H5 V
    , Q: \, K  ?* W( x' K& r$ u

    3 a) j' J8 l0 ^/ Q! X. W  |& l0 m! F1 B% }3 t# h; [+ U
    8 z2 _  M. x5 a$ x% V* d. D

    & s0 i4 l+ ~( ^4 c5 v% c6 _4 `: A: CC++编译后,Base类的虚函数表如下:' C9 `6 R% V8 G- Y
    [backcolor=white !important][size=1em]PHP code
    ' f2 F) R9 X( {
    [color=white !important][size=1em]?
      l) F+ r1 ~- u+ l8 e+ J& G
    [size=1em]1

    8 ~, X' m3 ^, [" Y" C! T
    [size=1em]2
    3 G2 ]" g) s  Q3 ]
    [size=1em]3

    * [9 u2 A" T9 ~
    [size=1em]4
    8 [: |$ S3 \. }* E7 |
    [size=1em][size=1em]  
    + c3 a2 H0 k- C* P[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|) x2 `0 {* |( Z0 \: K
    [size=1em]vTable:InterfaceU1 |Base::func1()|
    , e9 L7 l8 u# _& M[size=1em]vTable:InterfaceU2 |Base::func2()|
    9 T* f8 A* x7 v, N# U3 x9 y8 h1 H5 O- M- ^! P
    7 [  h, E9 m9 m3 ~0 D8 [1 @" I
    9 W- ^# X0 J4 o+ Q7 s
    & f8 Z2 g2 I. z% L. u

    8 Q, F: n! U3 E5 a5 ^2 T; S! n; Z" D如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    4 {2 |' {3 P% [5 H3 a: G& m( V+ P- W, Y但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    7 ^2 Z* J: h1 [3 J  fC++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    9 m0 O' z6 m5 h& c; @; }4 q: @C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)+ z. H; E# u8 [/ r

    * s5 Z8 _, s& R3 y6 o
    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-17 08:39 , Processed in 0.403651 second(s), 54 queries .

    回顶部