QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2034|回复: 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+ O- [5 ^# p6 e, m* [5 [8 i
    [size=1em]    InterfaceU1
    & M* ]1 E" b: P& t& i* S[size=1em]{
    1 W6 L5 }! P5 ^  G) @5 P: t$ M[size=1em]public:
    % Y+ y1 F* V6 ]8 `% J/ R[size=1em]    virtual void func1() = 0;
    & s- Q* [6 f# e6 c[size=1em]}
    7 t% x) ?: S7 K, k4 s  B/ n4 y1 [) \# q: C  F2 k; ]9 r- Y4 \) S
    [size=1em]class
    9 m$ d3 h4 K4 Z[size=1em]    InterfaceU24 Q6 H" f( e8 l
    [size=1em]{4 x: r( F  |. }# U
    [size=1em]public:2 t9 o8 B8 D1 j  ~
    [size=1em]    virtual void func2() = 0;
    / y9 f" c  t8 L2 e, Q8 R9 ][size=1em]}1 Q2 W% K6 s/ r! C4 w
    9 g) Z9 i5 l- D5 J
    [size=1em]class7 E6 J9 t5 z  }; h
    [size=1em]    Wrapper1 v; x; A, K7 s
    [size=1em]{3 _( h" A& B/ b+ O, a5 h" ~
    [size=1em]public:6 j) a% P2 K7 u  q5 V& G5 e
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;% N: J6 P! ]5 U8 ~
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;' g7 Q- j! J+ J3 ~/ [) J
    [size=1em]}' A; @" _% N! f1 n
    9 `4 q- _3 O: J3 I( V4 \* v
    [size=1em]class$ b3 M/ Y' i2 i5 A
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU27 o2 t4 U  C' x$ \# D$ S" y
    [size=1em]{. h4 K' Z) H. ?, a1 X) Z
    [size=1em]public:& G% d% {4 r  R1 i4 P4 r; `
    [size=1em]    virtual InterfaceU1* getInterface1()% N3 l) Z, W1 k3 n5 g
    [size=1em]    {- ], V1 G! o) v5 r
    [size=1em]        return this;
    ! {' E% P2 q! d[size=1em]    }
    % D" Y) a9 P+ g" O: ^[size=1em]    virtual InterfaceU2* getInterface2()
    $ e2 D: x; j* f5 O5 }3 _[size=1em]    {% A, g. j8 i  W/ E
    - b, T$ W1 ^* H& w) l; r
    [size=1em]        return this;
    / }" K% A, N+ d! J[size=1em]    }
    ) G1 _  K9 h' _5 d; U[size=1em]    virtual void func1()
    # e1 @/ W5 t  @; }8 l[size=1em]    {
    - B+ k$ a8 F4 _% P6 u% B[size=1em]        printf("%s", "func1");
    . C4 g+ [8 q/ H( G1 F/ a+ O# ~" E, _. ^[size=1em]    }% W" l% a8 s8 \  x: @8 H7 b

    $ M" S$ K" m2 G. u4 d# t[size=1em]    virtual void func2(). i( g6 N) ], V3 x: j4 P' d
    [size=1em]    {
    , u/ o; F- T/ y3 p& h1 n* J  w[size=1em]        printf("%s", "func2");
    1 i, M/ }. N5 M2 c0 e[size=1em]    }/ `0 [( n8 I$ c6 _
    [size=1em]}1 K8 X/ m* D5 S7 D4 `  w& W4 H; a

    % I7 b: R2 r' S2 D

    0 \! W7 _. c- i+ y5 @, e
    . j8 M$ o+ y6 c
    ' ~. f4 v. g# s
    假设有如下代码:
    . q& a2 c8 n, B8 S: v5 S[backcolor=white !important][size=1em]PHP code7 Y2 j+ a% h. U, D
    [color=white !important][size=1em]?

    ' |  b' ~4 N5 o$ v, z1 }
    [size=1em]1

    + Y- f+ }1 h6 F: T7 I
    [size=1em]2
    . E1 D" I) h; z8 W7 o9 x
    [size=1em][size=1em]Base* pBase = new Base();
    8 ?, ~9 _2 l/ r4 X0 o- o[size=1em]pBase->getInterface1()->func1();9 F8 V: i! U" D: y

    4 n% e6 k  i6 \
    4 u8 V  C( h) W  q

    6 a' c$ @- ~3 t1 b8 ~1 w. X9 }
    ) O. [& v; O, e. ~8 w( q- F7 y其实以上代码等于:5 h# m7 x% p1 }3 C# `
    [backcolor=white !important][size=1em]PHP code
    8 n; V$ [2 V; y, |. n1 G
    [color=white !important][size=1em]?
    ! n! A# ~+ N. ~# f; D$ b3 n# U. w2 Z
    [size=1em]1

    - e1 p/ f" ~9 T2 F2 P
    [size=1em]2

    ' t9 h6 a5 E0 u8 B
    [size=1em]3
    % v2 v' g! c) p& q# w" r" M
    [size=1em][size=1em]Base* pBase = new Base();0 R% e# I/ }& H: u, x
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    # _( E4 a( e% N. f# [4 k5 g[size=1em]pInterface1->func1();
    & n# W, w+ O8 v* u9 c, W
    : G3 {1 o5 \+ W' ]. d- o: }

    * G, a- G' s- [! d6 R( d+ }/ J7 M+ D, p" z0 _6 u( {3 J, @

    1 D- J9 I% j6 j! |& N
    5 O& ?( D( o. O1 r2 Q, p# x) W# o, _! u( a! Z$ S% b
    C++编译后,Base类的虚函数表如下:
    : m4 U+ A8 h- l4 y; Y; c( {[backcolor=white !important][size=1em]PHP code2 i2 J% q2 ^' b# h% h5 N
    [color=white !important][size=1em]?

    ( G% g2 c7 K  \
    [size=1em]1

    ) ]7 p8 ]8 x0 {4 z' f% R. M
    [size=1em]2

    ! A5 ~- G+ b( c  W8 O* T/ P
    [size=1em]3

    , b; a- V0 x$ O
    [size=1em]4
    5 x4 x5 j3 q" A# A) Z
    [size=1em][size=1em]  
    0 W4 m2 [  Q: _# f  ~6 J, k[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    1 ]/ `, A$ n. ~+ H% @6 b[size=1em]vTable:InterfaceU1 |Base::func1()|# p6 }8 z* I, T3 x7 G4 G
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    3 r6 }. y4 x2 J, \% g1 E4 t( a2 x0 s
    2 `1 r  ~3 o! Q% V% A

    1 h2 h" j' g* _! U4 i% k/ r$ U( f& Q0 `) c9 o; L
    / n/ R1 W0 }/ R) z' I
    ( F; \$ A- H! O/ L# O9 F
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。+ o# Q2 m5 ?6 |( {6 z; q) t
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    # E2 F5 P! {4 w- J, E2 R% WC++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    ) v2 b# v5 f, E) hC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)+ }+ B* ]3 S" ]- m( C4 t
    % K% X1 B9 k9 C0 s- S. r
    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-5-27 03:46 , Processed in 0.444041 second(s), 54 queries .

    回顶部