QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1764|回复: 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) f6 o; i6 l5 j2 V
    [size=1em]    InterfaceU1/ {" Y2 F* J. `0 H* s. W0 U' m
    [size=1em]{
    0 T9 w# \8 Y5 k* |[size=1em]public:( a8 g) l% F) o" j: T. c, L1 x* t
    [size=1em]    virtual void func1() = 0;: J4 g" B8 p3 h
    [size=1em]}8 U( R! n( w( ^/ r

    1 P+ H2 H- T* `* T[size=1em]class) L+ C& w( W/ d
    [size=1em]    InterfaceU2: e9 ]( {! y' h6 l4 b
    [size=1em]{; K$ p4 ?) |7 q. B
    [size=1em]public:
    ; p3 ~5 [  G4 T: P/ T4 M: Q[size=1em]    virtual void func2() = 0;
    1 K) L: _# F- P0 p( Q3 f1 ?[size=1em]}% o! k7 f( s" c7 o
    $ i* s  Y8 V" c8 D( f4 L
    [size=1em]class6 o' m' o% t& X" ^  f
    [size=1em]    Wrapper
    1 q- ?4 w& p# V[size=1em]{
    ( ]* f0 _+ A! }: L" k2 r, F* |[size=1em]public:
    $ v! h2 O" i3 n3 @2 h* ?& ~[size=1em]    virtual InterfaceU1* getInterface1() = 0;" M: V7 c$ R& ?# o4 Q% z# K
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;
    7 z0 U. c1 i3 e[size=1em]}
    2 P7 T1 x; s# h; Z# z1 w1 E9 a% X3 n
    " ]0 w; N4 O+ C& ~% b% V2 V- T; d[size=1em]class( E# E# a+ j5 j& `% ]8 E4 X
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    , B' g* Z! J, _" X6 Q1 @) X' v% g. x[size=1em]{
    / q% ~" O* H$ m" V& [[size=1em]public:3 s4 e" E7 n" M
    [size=1em]    virtual InterfaceU1* getInterface1()
    6 E% k1 ^5 b2 w. P! R1 ]) w* w[size=1em]    {' J: j  b1 `, @, e
    [size=1em]        return this;
    % G: w, W+ ]0 ]; h[size=1em]    }- C+ j6 ~. D4 m' G, s% O" t2 a
    [size=1em]    virtual InterfaceU2* getInterface2()
    ) S5 x3 L/ ], }5 \0 s8 \7 Z[size=1em]    {- D  N- Y" U) y/ D1 @
    9 m: F. r% ?" J! r- [: B. t& o
    [size=1em]        return this;
    , b6 ]' s% H$ c! f[size=1em]    }
    3 Z! H- D' p; h! c[size=1em]    virtual void func1()8 R9 F+ {" k9 M9 C  X
    [size=1em]    {0 s/ Y8 Y, A5 \( V" M
    [size=1em]        printf("%s", "func1");% B4 D9 w# u1 G3 X; r$ L) `
    [size=1em]    }- H9 S) P8 N/ O7 d0 @4 f! H
    5 w/ \! A2 M4 M1 C* L
    [size=1em]    virtual void func2()
      k6 I8 i; [9 v4 `" ^. O( p( o[size=1em]    {+ H) S; i3 C8 Q( x+ ~5 z9 ~7 Y
    [size=1em]        printf("%s", "func2");
    7 a5 L: x; r7 k* K# V/ c[size=1em]    }) h. W. d8 a0 j$ {
    [size=1em]}
    - h3 s: J  W* [: k
    ) S( r/ V1 g% D1 r8 C4 P' y

    ; w, h  r* w2 R# M
    2 [; z! _' O9 |7 I/ e
    8 f) ?: Z0 C3 ?8 h8 ]) i: v. z# R& Q
    假设有如下代码:  V* N, _8 O, I" c9 m3 a
    [backcolor=white !important][size=1em]PHP code
    # x$ T2 @) h! v) v* g) W  r+ t
    [color=white !important][size=1em]?

    / K1 k$ Q( T2 A5 P
    [size=1em]1

    3 }2 H5 x) J6 R# J1 f3 |; \9 l* m
    [size=1em]2

    7 q" _0 W# {2 s3 K# m- I
    [size=1em][size=1em]Base* pBase = new Base();/ H2 W& Q" l) ]: o! Z' T
    [size=1em]pBase->getInterface1()->func1();
    + Z! Z+ j3 V: ]6 V6 D; v! S
    - ]2 Y" K/ T2 I- F) ^. ]  l

    ) e4 z% ?2 z8 I- O4 o% S/ M/ `0 q
    2 D% j3 b$ o. d6 ]* j! i  W/ m$ C
    其实以上代码等于:  p* L. R4 J0 U3 P% G8 X
    [backcolor=white !important][size=1em]PHP code: D& l  j( Z, H
    [color=white !important][size=1em]?

    / L. N7 d1 _' M. O# {' y
    [size=1em]1

    + h. L& k' E6 ~1 ]4 O$ E2 L
    [size=1em]2

    " P! g# _) p. i$ K, q* u
    [size=1em]3

    , G$ i5 W7 b1 [' W& T9 b
    [size=1em][size=1em]Base* pBase = new Base();
    0 }6 Z6 \0 b3 ^+ u* ]& H) U[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();6 w/ b$ D" O, p- P
    [size=1em]pInterface1->func1();, J1 u5 f" i- d9 R

    % i4 P5 N% P, l- H  W4 g# K: I

    3 [. R% x' q2 {5 i3 N" M; s2 M; n) M6 s% \3 M! }: P

    , B, Y( ]& U9 S; }$ [, y- }! W) G8 M6 X5 `& y8 C4 U& v' K; e

    # \6 B3 x3 w7 N3 LC++编译后,Base类的虚函数表如下:1 Z2 t8 u7 K- C6 Y& ~6 O, d
    [backcolor=white !important][size=1em]PHP code9 s! ~2 R5 v8 V4 D$ N: g
    [color=white !important][size=1em]?
    ! z# p8 O- P& B; j2 o0 W3 D0 ?
    [size=1em]1
    5 }9 t/ m/ E( X' }1 |1 t; q  F. [7 s$ z
    [size=1em]2
    ! P( h4 E. v( p: [% e8 c
    [size=1em]3
    ; F# `6 i& n4 b/ b4 ?
    [size=1em]4
    0 b1 p4 e! g  O' i  y! J
    [size=1em][size=1em]  
    0 p4 e3 j$ I2 R; |[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|# H! O" _. S/ ?. P4 \3 Y$ [
    [size=1em]vTable:InterfaceU1 |Base::func1()|
    5 ?( o4 r7 r6 ?4 C7 z[size=1em]vTable:InterfaceU2 |Base::func2()|% V' e3 H6 W! E6 Z7 V
    ! d5 U1 F& x, ]! ^7 X

    2 g$ Q- m7 J0 x) Y; `- {/ s8 y- S0 ^
    ; E1 j" {% D9 F7 `3 O
    4 G8 ]# V9 I' \5 S/ |5 |; c) T& T
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    0 w6 V0 W# V3 S但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。- y& f2 \- [$ H
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    - C7 D! y5 m; @C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)# q+ z# ^$ c/ E; h) k. D3 Q! O

    9 Z* N. w  P. }' @+ k
    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-9-1 08:00 , Processed in 0.545733 second(s), 54 queries .

    回顶部