QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2012|回复: 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
    ) T; |# v% x2 N' X( e4 A9 m: b. o[size=1em]    InterfaceU1( `+ o7 r4 ?6 n  b* a" T! u6 e
    [size=1em]{
    7 F" ^9 r9 W; F$ [% T/ G; G4 P" z[size=1em]public:) `0 g: @( u( R( f$ T9 `+ y
    [size=1em]    virtual void func1() = 0;% t# X' N: Z8 x$ {
    [size=1em]}
    & e; ?9 [2 r% |4 i& E4 M; r$ U6 p) m- `
    [size=1em]class1 j; u9 Z3 t: F6 q1 q
    [size=1em]    InterfaceU2
    5 V, m  h) ~; @4 v$ H1 Z[size=1em]{
    9 @8 G/ T4 e) z9 y5 \5 l% s1 f[size=1em]public:
    3 K; w  `6 \0 m4 d$ v$ \1 U[size=1em]    virtual void func2() = 0;
      T0 }" D0 ?7 B' C" X+ f$ w[size=1em]}/ U* |  n+ e" T5 {+ E5 n

    # W5 B2 C6 Y5 a' b+ s[size=1em]class" ?5 R9 K7 q/ `4 p
    [size=1em]    Wrapper2 H  y4 c4 k: a, Z, W3 h" |! Z
    [size=1em]{. k, M, P6 U7 q( Y/ d( Z" V2 _
    [size=1em]public:4 C* @: k- e  i8 n- G2 a% R* A1 ~
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;+ t$ q# I. s. i  Z. V+ x0 ~2 }
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;% |- ^3 o$ E6 u0 V) C$ x- {) [) a
    [size=1em]}
    6 q1 Z, w# v, m" Y! ?$ r" E0 J6 M$ y0 ~, D* Q/ h0 l1 H- U) k
    [size=1em]class2 q2 h$ C; R+ [5 O: }
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    + |2 U# _/ d. r: j- R; F[size=1em]{
    : _7 C5 O3 v. E  [& y6 _" ][size=1em]public:
    0 V1 B# E4 _0 y$ c7 e[size=1em]    virtual InterfaceU1* getInterface1()7 `* D2 ^9 U" v3 s; w2 b  N2 |
    [size=1em]    {
    5 p; a, Q( o$ e+ g[size=1em]        return this;& a1 D# T% X6 s" v+ J( _
    [size=1em]    }5 R- g6 k" B9 }: ]. w( L0 h/ N
    [size=1em]    virtual InterfaceU2* getInterface2()
    + m0 w% x$ H" _. F" P0 ^! R[size=1em]    {$ b6 o. r) @: s( m$ Z2 p% {" Z
    3 Q0 a4 y' u; e2 L
    [size=1em]        return this;
    5 o9 V) f/ O# h7 C; O; P[size=1em]    }% E6 i9 K) b, ?# x
    [size=1em]    virtual void func1()
    * p. H' G* s8 }) i[size=1em]    {5 Z6 D3 Y5 f5 l! a
    [size=1em]        printf("%s", "func1");8 b6 u6 s8 r  u# o* g
    [size=1em]    }
    # C1 Z& y1 ]. t3 B* ~7 u
    ' W2 _2 x' Y: {. }. d; G/ ][size=1em]    virtual void func2()& B; f1 P# D  r; e( c/ W
    [size=1em]    {
    2 ?4 l; i8 v9 b/ j% `& N4 F[size=1em]        printf("%s", "func2");
    ; ]- C3 }# x# J; k[size=1em]    }5 Q/ j8 G  Z* v* C* b
    [size=1em]}
    % c- F5 W, l( S% P0 x
    - M2 J  ^! k# l: j; t- \
    4 S# q) ?% s( M- U+ i. Y% y0 Z
    1 H0 ~% A" p* }: c  _5 O2 s

    ! }1 x; t! w% X% O' O: x" P3 n假设有如下代码:! q6 f7 K, z  U' M( N' \  o. M
    [backcolor=white !important][size=1em]PHP code  _: `3 X! b3 V, i$ V+ t" r
    [color=white !important][size=1em]?
    9 ?/ e3 ], b) q, |3 b+ z* _1 Y- L- M
    [size=1em]1
    - D- N0 i9 o! I: j; F( {2 J
    [size=1em]2
    & Z, o; z# @: b1 |, p! {
    [size=1em][size=1em]Base* pBase = new Base();3 m4 F- N5 d4 v' g
    [size=1em]pBase->getInterface1()->func1();
    # F* F, k7 {8 m" M0 E3 o
    , B1 T( H1 Q) x- P5 b0 z

    2 C- j9 L# f& i, w1 k0 r8 `- x# k: U; U* `+ Y( T4 E4 c6 A  F

    6 P" ?' I) y; p' |其实以上代码等于:
    1 Y! h1 Q" O* M[backcolor=white !important][size=1em]PHP code$ X; N8 m# P/ J% e, o8 n' H
    [color=white !important][size=1em]?

    8 D: Q" ?" J0 {: R* y
    [size=1em]1
    + R" q! z' c" K
    [size=1em]2

    " z1 `) m$ g$ T3 A5 ]. O/ C# L
    [size=1em]3

    * Y2 S6 |) @9 \# S: E8 v2 h
    [size=1em][size=1em]Base* pBase = new Base();
    1 T7 ?  R6 E" N) W  e) U4 _[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    ' o! N4 ^7 ]* N[size=1em]pInterface1->func1();
    8 u; Z, o* n& J) E6 X/ Z+ w0 q
    2 I6 _, ]8 P6 c- H' [
    ' h5 D" F' u% T0 B

    3 O$ c: C4 {. K6 s& F# K2 s3 z' m" V4 g/ F" {
    3 D7 w1 W+ Z. Z: @4 c" i

    2 g: i4 g1 \( g; M+ B+ S7 I2 J, cC++编译后,Base类的虚函数表如下:
    # t' x/ m: M$ d& t3 t* O& f" |[backcolor=white !important][size=1em]PHP code* n0 h& x& F5 }: x7 Q( C8 ]  r
    [color=white !important][size=1em]?
    , U( U8 K; p! I1 n4 g
    [size=1em]1
      X% z. N6 u0 d( I# E' U; X4 S" N
    [size=1em]2
    ! X, h. p5 J$ c7 s6 i( C
    [size=1em]3
    ( v) x. Q1 U0 `3 P( N. Y4 v7 Q
    [size=1em]4

    1 D3 z1 C; c8 x" ?) v
    [size=1em][size=1em]  4 h# u2 b3 s0 R+ o) U# l$ W$ F1 r
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    ! R2 N( D( Q' r[size=1em]vTable:InterfaceU1 |Base::func1()|
    . {& o" i8 T1 P4 n; [[size=1em]vTable:InterfaceU2 |Base::func2()|! _$ q, `7 j5 U; Q3 a, ~2 g

    , @5 l* W# M% C/ W/ s; k' e
    - k4 F# _0 z0 A# \4 [6 c) Z
    " ]4 S  R/ d( L9 F3 e
    . h% n' {% O' U: A& D0 r5 @3 J

    9 A$ E# l3 s. [* v& j* @如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
      c$ C9 F4 H# P  [但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    6 Y/ }0 {8 a) r* }' [C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    2 d% N( e3 P- O0 R2 b/ h% V6 J. ~C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)3 b5 ]( J- F$ `  ]+ F) \

    ! l3 c( d8 K& l
    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-4-13 10:27 , Processed in 0.446105 second(s), 53 queries .

    回顶部