QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2010|回复: 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
    % \4 f1 ~8 o+ D( m$ l7 H[size=1em]    InterfaceU1; l) ]; g! q6 |9 x: S8 b" i
    [size=1em]{
    7 k  H+ c5 T- Y5 ~$ V$ m[size=1em]public:
      M6 T: L0 J9 C3 U- `[size=1em]    virtual void func1() = 0;
    & l6 F) K  F# o% R  B. q8 r; N[size=1em]}
    + h8 X( `3 Y4 F0 F+ C/ v( E' r1 a- ~- Q/ E8 D
    [size=1em]class2 T  X6 X+ \) J2 g% m
    [size=1em]    InterfaceU2
    $ U) F7 |  f- }' q! x) ^. L" y) y[size=1em]{
      c1 x$ A$ h6 M/ @( Q% y[size=1em]public:+ s5 a; O6 R0 u
    [size=1em]    virtual void func2() = 0;% x" j7 ^, p# s! P& d: r
    [size=1em]}( i9 F; Z  Y; \" ^) \

    % |. P9 l1 L1 i, B, R, t7 y[size=1em]class
    ; C( p+ q; v4 Q  O[size=1em]    Wrapper% @6 e' C" z# j  D( y/ j
    [size=1em]{
    : j) l1 U% M/ F4 U) M: y/ |[size=1em]public:
    3 |' R* X, }2 ^1 b9 u1 s$ S[size=1em]    virtual InterfaceU1* getInterface1() = 0;, X9 V3 e. c7 {" f6 h' j0 p
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;
    - S- I! |# r, K5 `7 x0 Z) M[size=1em]}
    ) S' q% Z1 Y1 \, D) Q+ s
    1 u! |  Q4 {$ o[size=1em]class
    7 W; o" i  ^0 Y( H0 I[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    ' z/ k, e  j7 u1 ~[size=1em]{- W6 s3 z: U0 J% {7 ?2 l+ w  w
    [size=1em]public:
    1 d  U: A. d6 x% u[size=1em]    virtual InterfaceU1* getInterface1()
    # {8 V' Q7 x. L( K$ }4 g, c[size=1em]    {
    % `5 O# ^1 |$ {. l3 m- s: ?[size=1em]        return this;( ~+ @- k5 E. [  @
    [size=1em]    }
    + i* @; Q2 B9 A[size=1em]    virtual InterfaceU2* getInterface2()) o$ m/ @! w0 a  H6 n! p; {, p
    [size=1em]    {( d3 g( W+ d8 o
    3 R! G$ [+ E) h8 ]- A& n  K6 H
    [size=1em]        return this;4 |+ E" }+ ^% _& {; T* I; C+ b9 w
    [size=1em]    }+ Q, j* D  X$ o1 u0 o  V' d3 d
    [size=1em]    virtual void func1()
    ' @7 M7 x& [/ @. y/ _. L[size=1em]    {
    8 u5 ?  @1 V; O2 y2 j1 K; L9 F[size=1em]        printf("%s", "func1");
    6 u+ ?0 u: g6 C3 V# d- w[size=1em]    }
    - v8 Q- o0 b' ]
    + t" T% l, r+ r[size=1em]    virtual void func2()( p  }$ Q1 t$ y7 b9 `: x. U
    [size=1em]    {
      Z6 B; O8 D" _# O3 F[size=1em]        printf("%s", "func2");- F' h* h9 [0 Y6 q% C4 ?4 T! u# N
    [size=1em]    }
    . h) |. O. I. U( T. J; D' f6 e[size=1em]}& X- q& x% d7 u

    % b4 {! K" j' D! x8 n6 U  R
    , m" d) E/ m- N$ ?  `# h8 {  Z
    - [2 |  T( J) i# `5 Q% R

    8 y/ U3 x2 H) i: U1 L2 _* @* e$ b假设有如下代码:5 l/ e/ Y+ _- v/ h/ ]/ W; ]
    [backcolor=white !important][size=1em]PHP code  P& R$ M. y. c3 D
    [color=white !important][size=1em]?
    + y: P$ F. T# C0 {7 J! A6 M" a! v
    [size=1em]1
    7 L! O# T# ?. {3 g7 M+ M0 @! Y
    [size=1em]2

    # \" K. X( O+ o: e  p7 a
    [size=1em][size=1em]Base* pBase = new Base();& z5 [7 c+ {+ q7 K+ H
    [size=1em]pBase->getInterface1()->func1();
    9 q9 `* B6 Y& D/ ]# e7 o5 k( X0 l8 P; u$ h. |3 c
    9 n2 ~/ U4 c; @' ]

    8 ~4 T8 {/ u, C4 m3 @2 w+ d
    * N- L; v0 e/ d: `" z其实以上代码等于:' j$ e9 y% x0 {# ]) ~" {
    [backcolor=white !important][size=1em]PHP code% f7 ?+ t' P* d* Q$ V2 I! i
    [color=white !important][size=1em]?

    - `/ \: Q! t- S# y. V0 W1 T8 a7 k9 J
    [size=1em]1
    * e% g' v  Z( V: r7 U
    [size=1em]2
    " U( c2 n  T2 M# f7 o  a* r& m
    [size=1em]3
    - s* C% W! k) C: M% v
    [size=1em][size=1em]Base* pBase = new Base();  d" J5 B9 W) C+ t/ D7 y
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();# g6 a- g" R5 J2 x+ @( o) Z
    [size=1em]pInterface1->func1();, C7 I. K! B8 A4 [1 H) R2 H- E) J

    * d+ q% N  A0 U- V- G7 p
      s& n) A* p  h+ |! E. ]: r

    6 I0 U1 K2 R2 ^9 r# c: v
    3 }2 s/ S, E" D1 A$ Z+ {
    # p: \( z  i) z! U
    : j! f% A, o; C3 ~+ E* B4 AC++编译后,Base类的虚函数表如下:
    ! X& @, ^3 J" s% X4 p& `. s1 I[backcolor=white !important][size=1em]PHP code
    # T# u1 Q1 j; o! b6 J, l2 E
    [color=white !important][size=1em]?

    6 b$ P6 X$ m+ D1 A
    [size=1em]1
    6 J- M8 W+ U  F1 p; g# D  T- M' |
    [size=1em]2
    + v- R7 f/ @. s- \
    [size=1em]3

    ! P8 m- W" W7 g- l
    [size=1em]4

    / v- ?9 }8 ?% {( Z' {% K
    [size=1em][size=1em]  
    " |1 `7 ^- R: T2 s1 `- E[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    : T5 r3 o* c& @# ~3 u! D1 ?[size=1em]vTable:InterfaceU1 |Base::func1()|8 \% _0 G  Y- B& q& j7 o' y
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    % M1 v9 m+ O+ w6 @% t- q% Z
    # L  v& I4 \: r

    & H! z7 M" x/ l+ ?/ Y5 @3 e8 A  v, ?4 c) a( t1 X+ J4 Z
    9 G9 |$ Z+ R9 i* G1 z

    7 o/ g) j- L. X4 z8 Y5 v* W: o$ [如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。' ~1 L8 y; O5 s7 ~2 ?& ~' Z
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    8 U' h9 z, s+ ~5 L4 q; L+ ]C++是如何得到当前应该使用vptr[??]位置的函数地址呢?) D7 i: R9 N3 V0 R, ~( F6 L0 I7 W
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    ! ^( y* [8 @8 }* K; R% z
    & ^+ P/ U) X+ k/ }! _* @$ K; Z4 E4 j! D
    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-12 23:23 , Processed in 0.435369 second(s), 56 queries .

    回顶部