QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1748|回复: 0
打印 上一主题 下一主题

C++ 中多继承情况下 如何确定某个类型的方法,在虚函数表中的位置?

[复制链接]
字体大小: 正常 放大
蕾欧娜        

19

主题

9

听众

25

积分

升级  21.05%

  • TA的每日心情
    郁闷
    2015-4-14 11:21
  • 签到天数: 1 天

    [LV.1]初来乍到

    自我介绍
    德玛西亚
    跳转到指定楼层
    1#
    发表于 2015-4-17 09:51 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    [backcolor=white !important][size=1em]
    [size=1em][size=1em]  class0 Y6 P/ m' `1 X) Q" w
    [size=1em]      InterfaceU1) y6 z; X$ `1 _
    [size=1em]  {
    : @  d+ T0 V4 }[size=1em]  public:
    - c% C2 d2 m& I4 M: [; ][size=1em]      virtual void func1() = 0;
    ( Q+ |/ W: r; C8 p[size=1em]  }
    6 W" l1 z- j& X7 e/ {* h
    0 {: J; Y9 q6 C) p7 _[size=1em]  class8 @1 L0 b- [. Q  Y  `. }
    [size=1em]      InterfaceU22 F) L$ X4 H$ ^6 ^+ F
    [size=1em]  {
    6 K9 o: G3 ?* `3 u& g/ u[size=1em]  public:
    7 g' p3 z$ y/ q; O% q3 M) g: @[size=1em]      virtual void func2() = 0;
    # b" J# R# M8 \( V" b[size=1em]  }
    ' s2 H2 W% [, x. J: P# v; c8 S# S7 Q# Z9 ?% f  @6 H6 F0 G6 l
    [size=1em]  class# ~, @  G" {1 V  o# i
    [size=1em]    Wrapper- ^. K  @7 s7 ?- Q) _/ ]
    [size=1em]  {* t9 [' D+ P+ q* {
    [size=1em]  public:: i+ ?& a9 i  ?, `3 F1 Z
    [size=1em]      virtual InterfaceU1* getInterface1() = 0;
    - @/ X, |+ j% }1 b* K3 Z; I[size=1em]      virtual InterfaceU2* getInterface2() = 0;' W0 p6 r) @2 A( Y) J. H4 K; T
    [size=1em]  }9 f; O) B6 f, J; P( j4 W
    1 G' r+ A% i( Z
    [size=1em]  class
    3 f( s! k7 L/ R[size=1em]      Base : public Wrapper, public InterfaceU1, public InterfaceU2! `1 ]7 N3 L$ V; m4 N! A  \
    [size=1em]  {
    ; @/ W# p$ u# C9 U& n" N[size=1em]  public:% v* \4 d) B% d" @& c
    [size=1em]      virtual InterfaceU1* getInterface1()
    / ]5 n9 V5 P% \# @7 o& ]# I[size=1em]      {
    5 o- b6 Q% N. Z! n[size=1em]          return this;. ^# N& ?  O1 H6 A$ q$ E. u/ O- D# r
    [size=1em]      }; [5 F+ t" z! ]2 K$ n
    [size=1em]      virtual InterfaceU2* getInterface2()4 g5 c9 J6 `$ a: c: W1 U
    [size=1em]      {
    : g, C( M# `$ P. R2 D# c9 n/ t* |  ^* O3 M
    [size=1em]          return this;$ P; d+ J0 L* [' \8 Y; j, X2 d0 |/ [- R
    [size=1em]     }
    , E$ |/ p! c$ r: j5 N9 |9 i, k$ F[size=1em]     virtual void func1()7 ]- L5 j: |/ V* M6 [* Z; K+ @% D6 t' t
    [size=1em]     {! s9 y+ n( T0 `9 ~
    [size=1em]         printf("%s", "func1");
    0 k0 I- i$ m% V+ U[size=1em]     }+ p& ]( n$ _! M! I5 @; l: J/ `8 N

    + b9 c' n3 a/ Z  o9 C[size=1em]     virtual void func2()3 {  C2 H+ |! p+ l& Y' D' D' p1 n: N
    [size=1em]     {/ a1 O" F1 b# @8 Z  V8 \6 v
    [size=1em]        printf("%s", "func2");! f1 s# G' o- |4 ?3 c) s' W9 _
    [size=1em]     }
    3 l  [2 b' T( G' c[size=1em] }
    % Y. {! {  a- D4 X! R- z2 o2 C  n3 Q! b4 H( B

    0 q! d  j0 c8 e1 h& o

    ) W) e" p4 i# a4 [6 [1 x
    9 O2 f2 I7 [! t假设有如下代码:+ A, J; z0 }5 Z1 q
    [backcolor=white !important][size=1em]PHP code
    ( @  J  R9 v4 S# Q2 J) \
    [color=white !important][size=1em]?

    . N9 G8 W" T3 V& j  I
    [size=1em]1
    ! ^7 m$ H- |& q
    [size=1em]2

    , h% f# c& W. B5 l8 C
    [size=1em][size=1em]Base* pBase = new Base();+ w$ ]  |/ d8 I
    [size=1em]pBase->getInterface1()->func1();* k/ t3 \6 o) e! ^
    , b  I4 A, v3 K5 s. y2 }7 q/ `

    ' _# W' |8 g! l6 }! i+ T3 o" y1 q9 ]5 k' Y; m( s% h
    / F/ @+ q3 b1 p3 m
    其实以上代码等于:
    - {5 w- R* h9 \1 X& q/ M[backcolor=white !important][size=1em]PHP code1 e  b8 V7 P: {; N
    [color=white !important][size=1em]?

    / b/ Q) A1 q  x5 N9 b
    [size=1em]1
    : [( n0 h( n: |; o& C5 V
    [size=1em]2
    + {* V7 \& u6 O( o1 z# P; h; G1 u3 O
    [size=1em]3
    % F# n2 l3 ~+ G5 v# j9 i
    [size=1em][size=1em] Base* pBase = new Base();/ A, K. X$ l3 ]' q( d8 ]
    [size=1em] InterfaceU1* pInterface1 = pBase->getInterface1();2 @1 B! j2 s) W7 d
    [size=1em] pInterface1->func1();; M- {1 ?% t/ y- t( M

    1 l8 f, P1 ~# s/ G
    * }7 N4 r! n  ^, b* G  W* l: f7 o' o
    + u  P; i4 R7 U( d
    ' |& x: f- z, R* E, u* c
    / v0 A5 N2 {' z! r; V. Y" d/ A, u
    2 Y. ^+ p  s6 q4 P% _3 P( D/ }6 o
                  C++编译后,Base类的虚函数表如下:
    & e) A4 E0 Q  }4 ^3 Y[backcolor=white !important][size=1em]         PHP code4 |% y, {$ E" D/ Z9 N- E+ e  S
    [color=white !important][size=1em]?
    % i0 ?8 f5 s6 C" M/ d- B1 l
    [size=1em]1

    # Z6 Y* M- W1 v5 l
    [size=1em]2
    ; M% g) A) Q& d) I, b- O* W; E$ s
    [size=1em]3
    8 J3 s  q$ s% A8 I
    [size=1em]4
    . z! U9 i9 x* b" ?1 |2 Q/ l
    [size=1em][size=1em]  
    3 L/ z( [: g3 P" _* S2 e[size=1em]  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    % E6 t- o7 p1 U) H3 i[size=1em]  vTable:InterfaceU1 |Base::func1()|9 d9 ]* Y2 f1 c
    [size=1em]  vTable:InterfaceU2 |Base::func2()|
    : I' o" S: R  g3 ~" P$ {- v' t# h

    4 g  P2 U0 R  c; L% @9 D$ i8 x' M0 h2 L& N

    2 \$ w; F! M# H- t, \  Y7 y' v  q7 Z# \( y0 S
         如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    % y$ n* z! F3 `0 E0 Q7 s& N    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。4 }) |$ W# D9 H& m/ v3 P. U
        C++是如何得到当前应该使用vptr[??]位置的函数地址呢?' R: u8 ]& Y" m  T5 k
        C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定): d4 b9 v. Y" z! c# j
    * s" O" p' R6 g0 x: A
    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-27 13:28 , Processed in 0.516209 second(s), 49 queries .

    回顶部