QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2013|回复: 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( b0 c2 v5 T' Z[size=1em]    InterfaceU1
    * F; O+ O6 U7 W* A[size=1em]{# p; @, f& j# s3 m4 n/ V& U
    [size=1em]public:
    8 Q% J8 {) g$ Q* |. f[size=1em]    virtual void func1() = 0;
    ; H/ J, a5 q# e- p0 ~2 ^[size=1em]}% k3 w; _8 V, U5 Z: V! ~9 {

    7 d! k5 c5 o+ K" ~[size=1em]class
    3 D3 t8 e9 i0 _9 i6 x[size=1em]    InterfaceU2( v: y/ L$ Q" A1 T$ ~+ ~* d
    [size=1em]{
    3 e9 v8 q# K* X* @; T8 Q/ F9 Q[size=1em]public:% Y1 K0 y" {. q9 d+ {2 U
    [size=1em]    virtual void func2() = 0;
    9 _5 j' Q& F5 K% v8 b& E: J[size=1em]}
    8 s" S- M4 r7 I+ J0 G* k' |$ V& r# T( b9 g0 w4 ?
    [size=1em]class
    & l! B0 v1 n" q3 ^[size=1em]    Wrapper5 [. }2 j  S8 q
    [size=1em]{7 s6 G* ^1 z7 h( T% g1 @
    [size=1em]public:) ?+ D1 Y6 S' Q& E1 U
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;
    4 X8 b/ f1 @0 p" L[size=1em]    virtual InterfaceU2* getInterface2() = 0;$ @5 n: _; t7 d3 [5 F( t4 s7 k
    [size=1em]}: @  z3 f* U* ?- A: q
      F: r% u* X( s% e/ W2 ~  S/ w
    [size=1em]class
    , w* }% T, F# w6 O2 V[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU27 D! I% K* j$ z& `7 }0 `* G
    [size=1em]{* o, T$ D: ^& A
    [size=1em]public:2 U6 O( `; y% f) [
    [size=1em]    virtual InterfaceU1* getInterface1(), A8 p. Z- T3 C  N
    [size=1em]    {! _2 l) R9 H* B6 f2 F
    [size=1em]        return this;  W! m! o! ~& J( R' e
    [size=1em]    }" n6 \9 P4 z5 q: m
    [size=1em]    virtual InterfaceU2* getInterface2()
    5 e# n5 W2 A" ]0 q[size=1em]    {9 K3 \' R- V  l, M

    % R: I, l. X' P) C4 |4 N# Z2 D% N[size=1em]        return this;
    / m. }$ J& _) A8 e; W[size=1em]    }
    % b$ L$ J3 N3 {3 V9 f/ d[size=1em]    virtual void func1()
    5 s. v& q" Q/ g9 v) F[size=1em]    {
    3 q* ]9 Q3 l0 z( M+ U[size=1em]        printf("%s", "func1");5 g) t# w3 f/ U- R4 P
    [size=1em]    }* J& L% a- V7 L* m# E  H
    + [  T! ~+ ^4 p' T5 V8 }6 p3 C
    [size=1em]    virtual void func2()
    8 {/ ]0 n: }& o9 ^' L. Z( r[size=1em]    {
    2 d) U4 m0 _: }+ f4 v6 x[size=1em]        printf("%s", "func2");/ e  k6 q0 A" a( D0 D, N$ a
    [size=1em]    }
    3 y+ X5 ?. U/ K3 T2 q' D4 f2 H[size=1em]}$ ?3 j7 j& |* V, Q8 r/ o

    . T: v3 V( p; O* L# O. G5 Q* j
    # C( |- @% y8 U- |

    , L  N& g- S. H$ {5 @# P
    7 I1 o" I- V1 r1 Y7 J; L7 w假设有如下代码:
      G  M. g7 q9 U0 W! z2 H[backcolor=white !important][size=1em]PHP code7 x4 R4 A! [$ w: g
    [color=white !important][size=1em]?
    - X9 W( O* x% W7 D9 \. @1 T4 r
    [size=1em]1

    / {, U( I. B* i5 K; ~! B
    [size=1em]2

    / w7 l7 s" C0 K' ~
    [size=1em][size=1em]Base* pBase = new Base();
    - x6 T. M! E7 x0 |* A: e[size=1em]pBase->getInterface1()->func1();
    1 Q. s/ ^2 Z7 [2 r: E  z$ J
    - _0 |4 R) r( T6 k8 L4 B
    1 H  U  C: W% ~2 a( I7 ]5 g4 [
    / M4 Z" |: S! B0 e
    8 h. `/ h" x4 n( Q3 [- {
    其实以上代码等于:) k: q% T. H% o0 T: O
    [backcolor=white !important][size=1em]PHP code( w" b6 I: q5 W
    [color=white !important][size=1em]?

    / U. G7 u4 }& D, L  P9 O- |
    [size=1em]1

    5 h' C' R# O4 v8 N: A1 E. n6 B
    [size=1em]2
    . p/ `! ^; S; u/ k/ ?) N3 R
    [size=1em]3

    * p3 S% D" @, d( v1 h8 v
    [size=1em][size=1em]Base* pBase = new Base();
    8 n5 T7 W" C( ?[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    ' [0 r- T& l3 S) `8 F7 Y[size=1em]pInterface1->func1();
    % _0 R" X* q+ r' H
    : l0 c. W" f, O# l2 g2 S

    5 u8 z. @1 M' S* C6 Q4 r5 c6 H! R3 ~8 d/ @. B1 H% e: O

    # X$ `$ J" q1 R: z( x+ c* q( E7 q5 _7 K4 U4 E% j  j" ~2 v( }' h
    4 A% v! ^' V5 o, ~. O9 `6 x
    C++编译后,Base类的虚函数表如下:7 J7 u- m* ^: g% E! {
    [backcolor=white !important][size=1em]PHP code; v& n- P% ]1 U( G( a
    [color=white !important][size=1em]?

    - y! e9 m5 Y! }  Z& U8 m4 q  M
    [size=1em]1
    * ~3 v, @2 K8 h
    [size=1em]2
    + C. L! o- t) k
    [size=1em]3
    5 Q9 @7 V; |4 s/ F+ R# W( C' @( Z
    [size=1em]4
    4 S; V# W! Q% w" x* e: U
    [size=1em][size=1em]  
    " R; f. B+ d: P; t5 ~# B[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
      y- R; v& I) b7 o[size=1em]vTable:InterfaceU1 |Base::func1()|. w* T7 p' d( |% d7 @
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    ! P& e0 d* [, v7 X& \1 r) q: ~' h# V; a( C5 Z
    # P; j- M: j+ }0 D

    6 @% P) m0 s+ ]* P5 z
    3 i2 a$ n9 Q/ p" r9 R
    8 F# V, g# K, A% l/ E如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。! Y& m% J6 ?3 D0 w0 ~/ P* J) u
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。2 G0 U/ ^. m, s, c
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?6 i3 h8 I# B6 N, R
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    , H4 x0 x4 p/ x; j+ a  w: r& g' ?3 N
    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-14 22:11 , Processed in 0.341842 second(s), 54 queries .

    回顶部