QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1774|回复: 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
    : a* v0 h5 b3 e6 \[size=1em]    InterfaceU1
    7 {4 j8 K5 O2 l8 ~, p! S6 n7 ~6 z* s% s[size=1em]{, D3 S- s+ @' ~) o# c9 G' m) b
    [size=1em]public:
    ! E( w% |% A( \0 M: v" p) {[size=1em]    virtual void func1() = 0;
    , [) g8 J" h  T. \: E[size=1em]}
    . i* Y/ P1 b! g& }: ]7 }4 }
    . n- j" M5 \. [- W: w8 T[size=1em]class
    & u0 ~! G7 g2 x; T[size=1em]    InterfaceU2% K4 C, J) G9 C  W! R
    [size=1em]{
    * \: Y& L2 N9 P5 X: D4 Y8 c[size=1em]public:
    % ]5 s6 O0 b2 }- K[size=1em]    virtual void func2() = 0;
    0 \  q' d3 _# C  V: r, I! m$ X( T$ v[size=1em]}
    0 l' F: |* g/ ]% G3 {0 ^
    , W- C4 V. b7 P$ {9 S5 s[size=1em]class
    + R! z  M2 B3 _7 V! ^[size=1em]    Wrapper
    6 X9 V" N- z2 K[size=1em]{. J) J% _) x" N# n& ~0 I; B% _
    [size=1em]public:& g& u+ x% P8 D% v$ ~2 m5 S# h
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;, r: O  Y8 m4 n0 f: a! L
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;
    # G# M2 {; v, c[size=1em]}
    $ s: c$ ^+ n. z; X4 a2 W
    0 E$ _  V5 P# a' U% d: l[size=1em]class, ^- z* H9 D$ h* o. G  q
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2$ `! e! I2 @* z. e* c2 q
    [size=1em]{' S" K( y/ J; ?5 H7 ^$ @# [
    [size=1em]public:
    0 t5 E: i' o. ?7 c[size=1em]    virtual InterfaceU1* getInterface1()7 `4 \2 o# f3 |* ?& Q' J8 L: D
    [size=1em]    {/ {; e; L" e5 n. o9 z, h
    [size=1em]        return this;4 M0 a* b% h( V: N" _' s; H1 U" Z
    [size=1em]    }
    7 d5 s/ C# C! R! L' C  R9 D[size=1em]    virtual InterfaceU2* getInterface2()' @% I  l' @0 j1 V) J: C4 k
    [size=1em]    {$ ]: ]! U1 C8 G' l( G
    9 m% D% `7 t$ G5 i5 O# b
    [size=1em]        return this;
    " v6 K5 H1 x0 N! e/ F/ B* A[size=1em]    }* H! ?- ]9 G$ P1 d
    [size=1em]    virtual void func1()( R3 [, O5 L. }& y" W
    [size=1em]    {
    7 K% P$ \! \' H0 F7 F* @5 l[size=1em]        printf("%s", "func1");5 Y) E" R2 N9 E2 n, \
    [size=1em]    }0 |' U. d1 \% o
    + R; Q, _& o3 P3 W% b- V+ H
    [size=1em]    virtual void func2()
    1 x* V% U. d9 x- R+ i# ]8 L' |[size=1em]    {
    0 s9 y; j6 r. l% E4 b1 S[size=1em]        printf("%s", "func2");( t8 M2 c- e' u/ n
    [size=1em]    }* ]# c6 b8 I! Z
    [size=1em]}
    9 w0 ?) {2 Q" ^$ |. w* i0 o( }! T0 q" c4 [

      d% C- v* f9 J1 X% j3 T1 I8 y
    - g+ g# w9 I. n3 u

    1 X# Y& p: j2 C- ~$ W5 ]5 U2 K假设有如下代码:
    0 O& f0 ^% A2 u- W[backcolor=white !important][size=1em]PHP code' X; c2 R- d, ]1 t3 T6 R
    [color=white !important][size=1em]?
    ( D8 {* y; H' h# h4 M3 H, k
    [size=1em]1

    8 S7 Q4 D! ]) ]/ U! U3 U
    [size=1em]2
    2 o% m% Z8 _, o: e+ @( H
    [size=1em][size=1em]Base* pBase = new Base();6 X' j3 e* G; D
    [size=1em]pBase->getInterface1()->func1();
    , h& f6 [! W4 l% l2 G$ k, a# n6 [( S6 b2 J
    % @# x1 J* M% q5 z5 z! e

      z; `+ b# F) B6 h! x1 J
    + F1 |; V5 {1 _5 J其实以上代码等于:
    / x4 @' G0 p1 g4 q# _[backcolor=white !important][size=1em]PHP code  m) ]4 V, }0 S" k; `
    [color=white !important][size=1em]?

    ' G# A% V+ `- |$ ?
    [size=1em]1

    ) W! n4 l' T) q5 m4 \
    [size=1em]2
    * Q0 v. L. M% A% q: e' r
    [size=1em]3

    1 ^  j/ |9 Q4 k' k
    [size=1em][size=1em]Base* pBase = new Base();2 E5 T6 @! S+ I" `. _# l* i$ Z8 n8 J
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();2 j) S5 S8 w$ h3 K2 `+ D
    [size=1em]pInterface1->func1();
    6 y, ^3 e1 g/ v& E4 p; {  K, u% X1 }$ b( p% s0 T- E1 f

    ! M. g. S/ m# J; d, `6 P" t! v- _$ b  B
    1 Y3 j8 e0 i3 _

    " a6 b3 }! v5 S) a1 g- D2 y8 L; Q; M2 V- e; E& u6 @6 G/ Z6 L
    C++编译后,Base类的虚函数表如下:
    8 a/ X1 l0 z4 W& z) v3 z[backcolor=white !important][size=1em]PHP code
    . c  D, v9 {6 o/ G3 ?9 V: T! u
    [color=white !important][size=1em]?
    1 v7 D5 u# w3 L$ T% U1 k6 _5 R
    [size=1em]1
    & D6 R3 R) A6 y% D+ R8 c. @. m
    [size=1em]2

    " Y; E& l( T3 g$ x2 z
    [size=1em]3
    5 x6 k6 T2 g; P8 w: ?
    [size=1em]4

    $ Q1 f* K. u% M% k
    [size=1em][size=1em]  
    9 T2 H+ l! ?" m7 |* P6 `8 f7 E[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|: o$ p& }& \. Z7 |* q6 q
    [size=1em]vTable:InterfaceU1 |Base::func1()|
    + G/ D8 Y% N6 I9 ~: j6 n. u) ?3 H[size=1em]vTable:InterfaceU2 |Base::func2()|
    ( s$ \% D3 w7 t+ A
    - p# e, d) {" b! ~$ K4 Z

    " v6 I1 c' k4 `( l- @: V9 ~
    - U$ K8 V7 \, g
    # j; a7 F5 q4 S9 v& `9 N+ }% V5 [2 f( L+ M
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    5 ~2 z( N5 f. A8 f5 Y7 h6 n0 F但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。& y- V4 M1 S6 `4 T
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?/ d* U* P$ _4 W: D" R
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    4 k& F6 L4 g1 \/ c4 I- q3 k' b1 e
    : ?6 m4 i% ~! c5 V# v% Q- t
    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-7 08:05 , Processed in 0.338030 second(s), 53 queries .

    回顶部