QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2084|回复: 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% ]0 E2 d  H* X# l4 X! `' F3 G
    [size=1em]    InterfaceU1! @, _/ i5 H3 O) ~! }% r0 d/ L% h
    [size=1em]{- g3 Z( A' H4 {
    [size=1em]public:
    $ m% U/ y% y( M+ [9 b6 D' a# H1 r[size=1em]    virtual void func1() = 0;0 h) [. r9 B& O7 g
    [size=1em]}; q7 V2 [9 q+ T
    # [1 A2 s+ q, P* l: w7 Z; c
    [size=1em]class
    ) w0 M# E" x. n6 t[size=1em]    InterfaceU2. V, I3 u( W, F9 Z
    [size=1em]{1 f& x7 D5 P# k- t0 ?* @
    [size=1em]public:
    2 o) u8 t. Z- w; o[size=1em]    virtual void func2() = 0;5 @- s4 A# _% O# S( T2 l0 R* p
    [size=1em]}
    ) A+ K. A' B3 R( H! j
    0 E( |, J- w2 K7 U0 U/ [) Z  ^[size=1em]class: s* c- U4 B2 x# ~1 m8 o
    [size=1em]    Wrapper3 r) o6 e! T: z# R3 E
    [size=1em]{. D5 m3 t1 v8 p7 _( O1 `. G. r% u. h
    [size=1em]public:
    ' e4 d2 C3 r# z; H6 t6 A) X/ E" }9 W[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    * \1 B. k# B1 ?[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    ( v0 {* |% Q/ z[size=1em]}
    . |6 {1 a$ h2 a! _- |1 w* Z# k% L) }' \" e. G+ m& N7 J1 |
    [size=1em]class2 Z' o: K5 Y+ [% _6 W
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    ! \$ R& K" I4 S% a% p[size=1em]{
    . p  B. L) S5 z- v[size=1em]public:
    % H3 T4 {* g- f# {- H$ M[size=1em]    virtual InterfaceU1* getInterface1(), w" u2 H: Q% a0 f: i1 O
    [size=1em]    {
    5 \  {! C% _; k* ~& _+ V" F[size=1em]        return this;
    4 @( v9 k6 c: [! ~# G[size=1em]    }" f4 f7 g2 \& R' Z. [2 f1 I
    [size=1em]    virtual InterfaceU2* getInterface2()
    - }( F8 {  I2 h- @[size=1em]    {, [% ~) z  X" @. A) ^! p; J

    1 [' z: Z) m  e: q[size=1em]        return this;2 U& z4 `/ F% @- U& f% a3 P
    [size=1em]    }
    ) k- n2 D" ?- U# I2 h4 {" F6 E1 a# S: u[size=1em]    virtual void func1()/ r: u3 D9 ]; V5 \% u
    [size=1em]    {
    2 ~# n0 N& `/ r) }# n) N7 W[size=1em]        printf("%s", "func1");
    2 a; t4 @6 d; w; i8 f[size=1em]    }6 H, U0 {( c4 E% D7 c8 V9 H$ _# v
    5 B$ n+ c& p& ~9 n
    [size=1em]    virtual void func2()
    - f7 r: H  `) b  O: ]6 b+ `[size=1em]    {5 L% \" e& Y7 P( r
    [size=1em]        printf("%s", "func2");4 z3 ]$ `! E, I% V8 j2 q; M9 R
    [size=1em]    }- m. M) U) u# a. J2 t
    [size=1em]}
    - S* H* `' r+ `+ x
    5 \8 b# y0 e1 d* q

    $ y  ?6 N8 Y' f) K  ]6 j3 a* n

    * @, [/ V" }  V. ?5 p( ~& j# k
    * v; s2 |' w% m3 N假设有如下代码:. u* I3 c, A/ e1 f1 ?
    [backcolor=white !important][size=1em]PHP code
    * ?9 y8 r. g4 ]7 N) ?' W. A
    [color=white !important][size=1em]?
    * i) t: Y0 F0 G$ r
    [size=1em]1

    * y0 E9 ~" E0 v
    [size=1em]2

    ! q: V9 ^9 G/ t* G+ ]
    [size=1em][size=1em]Base* pBase = new Base();% `, v5 [3 D8 q$ Y. s
    [size=1em]pBase->getInterface1()->func1();
    ) I' }, A$ b1 B# N! ^1 g' u
    0 F; J* E) P+ x( I5 a

    / {& r1 T; P  U: u5 t9 i* S& T; ]$ \  a5 K: o
    & d9 a5 U/ P) c) p7 b
    其实以上代码等于:5 ^# r% U/ v! N
    [backcolor=white !important][size=1em]PHP code9 I* t3 Z! S6 G' f4 A
    [color=white !important][size=1em]?

    . x( ]8 \, z$ r: {  j  K1 z6 c# K' Y
    [size=1em]1

    5 X& K, S  t5 m% {) w
    [size=1em]2
    " U" r/ a& k9 D0 H
    [size=1em]3
    % B  Y8 ~& b4 n. T7 K/ F* P( I
    [size=1em][size=1em]Base* pBase = new Base();
    $ G, i& a2 [  R" `* i" t[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    $ t& n5 S$ T" D( V7 T3 p! a* S  k[size=1em]pInterface1->func1();
    * O; I2 H. n- h7 x# x4 K
    & v0 s% ~. E" M' S; z6 T1 m  V

    * b3 }/ |# e7 \8 h2 Q& Z9 F: Z  @+ Q$ L( q, H, ^% I  n. U+ _

    ) b, i, b% U( J' A' {" _; V/ r- B- Q3 X) d

    : ~, ], t  t2 i) m1 q) KC++编译后,Base类的虚函数表如下:
    0 o  Y# \  B( d8 e: I& K7 ?5 T  a1 T  w[backcolor=white !important][size=1em]PHP code/ f0 @3 A/ Z. u9 w& m7 V8 U
    [color=white !important][size=1em]?
      M. Z4 Z6 B7 ^, \: z1 [/ T9 e+ q  t
    [size=1em]1
    . m$ d# S( p2 I  U6 P2 A1 n
    [size=1em]2

    # {  G: i9 t3 h( h
    [size=1em]3
    - K& \7 Q  e. i% S1 D( n
    [size=1em]4

    0 K, N$ S. w# P- W
    [size=1em][size=1em]  
    6 P3 ~0 O0 O& `0 e- N[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    ; ]2 _2 N' R  B" Q  ~* ]& j[size=1em]vTable:InterfaceU1 |Base::func1()|6 Q' K% B. R* u0 v+ }
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    3 N( u+ z1 G! a7 ^6 S. G
    ( i) z# P6 p' i0 O- r  Z
    2 w$ D6 o8 U  S) i. m
    $ A6 w  Y; N2 t$ J2 o

    ! u: ?) O7 u) Y. T0 a; _. U
    + x; l, f$ j: }; I% Z: B. k如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。0 a$ v7 i1 D9 h( R
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。# |4 O% F" L* V3 e2 T
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    4 @. e; S3 r2 s7 C1 u4 PC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)& S# P4 J9 d2 a; [. i6 |1 T) g
    9 y% y4 E6 e9 E
    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-9-1 06:39 , Processed in 0.412090 second(s), 54 queries .

    回顶部