QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2070|回复: 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  B! s* n' b0 {6 B1 m8 }) w
    [size=1em]    InterfaceU1
    ' E) W, ~# X* Y5 z% p; U[size=1em]{
    5 E$ N6 _/ |7 c# y/ V[size=1em]public:* @- r* }7 N5 }. y4 G
    [size=1em]    virtual void func1() = 0;
      q& O. N1 g) o" K! j  `1 I[size=1em]}
    3 t! I3 Y* p+ q+ j! A8 T0 z3 o2 ?$ M) V: N1 ]
    [size=1em]class
      a9 r) X& k( k; T[size=1em]    InterfaceU28 ]! ], k0 b5 f$ o% r. A7 I
    [size=1em]{
    : k. G  S  L. w! ?& t7 ^+ r[size=1em]public:3 W( R+ _7 B& K+ w$ e
    [size=1em]    virtual void func2() = 0;
    ) I* R4 V- L4 `[size=1em]}
    & ?. o) [  M; S9 Y1 i' O% d! e
    # t' B# z! E5 Z2 k& @/ q& Z4 ~[size=1em]class! x% b8 o5 s+ r2 p/ l' m: f
    [size=1em]    Wrapper
    * p8 \) e) z- i# j! l[size=1em]{
    ) N: Q: M+ S( ?[size=1em]public:- B. j; q7 o3 j: s# o1 E. b- W
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;
    6 B0 x: W9 w  \6 P9 q* \0 Y9 N, ~[size=1em]    virtual InterfaceU2* getInterface2() = 0;; ^! p0 \# s" S, g3 e$ e, t; |) q
    [size=1em]}
    + R& F9 H7 v7 z/ q% b% k2 y/ Z( U, {6 k9 r1 a  z. J6 z
    [size=1em]class) S9 x0 n( {$ W1 O
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2; _$ B6 v& t& ?/ }* [5 c' k
    [size=1em]{
    6 a3 D$ k  {, Y8 ][size=1em]public:
    " _1 d. H5 D% T$ l7 `[size=1em]    virtual InterfaceU1* getInterface1()) \4 _3 J1 F& K3 ?- t- }$ y) o
    [size=1em]    {5 Z+ Y: n1 o  Y; i
    [size=1em]        return this;6 F7 t, M9 O0 }
    [size=1em]    }
    6 d$ D9 g  k2 g' e  E; E: E$ c; W2 l[size=1em]    virtual InterfaceU2* getInterface2()
    # `1 ~9 o5 J; g/ @3 v! n[size=1em]    {8 E8 b4 o; F. D4 y

      D" l5 C6 ^/ Y" v: b[size=1em]        return this;( |- T# O7 ~; F
    [size=1em]    }, V* C: ^: o% y( S( d
    [size=1em]    virtual void func1()
    7 H* E2 G1 h' D  ^/ I[size=1em]    {* R2 K5 P  u. @& ]
    [size=1em]        printf("%s", "func1");
    & \2 m* k. O* n! n8 }3 ][size=1em]    }- P/ d; o9 z6 x( C9 m+ D2 D  Q
    ; b# G5 r% ?$ T) a9 X
    [size=1em]    virtual void func2()% C+ h2 v1 g/ S
    [size=1em]    {- A6 w/ M* J+ d3 |- X
    [size=1em]        printf("%s", "func2");- P9 x: R7 P# g% G/ T
    [size=1em]    }
    * ~5 }8 i7 u" T1 |8 E+ p, y[size=1em]}9 D' z1 c* ^3 \! \: [1 W
    - Z' K' K) H8 h5 d" F

    % T" w' Z7 G9 i; K. E

    2 Q" O. I, i( K/ \% x) a
    * w! u( i! i* b假设有如下代码:
    / M$ }+ ]( K; s! Z  k" _[backcolor=white !important][size=1em]PHP code2 s* ~2 @+ w$ H$ T3 o. B
    [color=white !important][size=1em]?
    $ F- P: ]/ Y0 L; e
    [size=1em]1
    8 [8 d& b4 g% `) [  v7 a
    [size=1em]2
    " G" d, g' Z) V
    [size=1em][size=1em]Base* pBase = new Base();: t( J4 g0 Z& |4 {8 p7 @- I
    [size=1em]pBase->getInterface1()->func1();
    3 }3 i% l  F: ]* V+ `9 m: S; R& V# _. c! i  D
    0 V( m  C9 c" b; ~& J1 h

    ; m/ ~( S6 Z% S, R$ _. n7 O8 e$ R" u* D/ M+ N# d8 X$ [6 i
    其实以上代码等于:
    1 x5 J5 I& G" s: p$ h, k* n/ f9 S[backcolor=white !important][size=1em]PHP code
    ' v2 }5 Y2 C" {
    [color=white !important][size=1em]?
    5 r2 |" u- S* V! V) Z
    [size=1em]1

    ) f5 J1 ~) w  H/ @
    [size=1em]2
    0 M) E1 t' {/ |: ?+ [
    [size=1em]3

    ) J% Q& m' [* A* T1 s! Y( b
    [size=1em][size=1em]Base* pBase = new Base();" K' `& W+ u8 k* g4 \7 s9 H
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();1 ?! Y. w2 y3 G+ o0 J
    [size=1em]pInterface1->func1();
    + {# Z, u5 {& X" ?. B# ^& F. T( a0 W* n* _

    # n2 h2 |2 o! ]: X3 h
    , }+ D# Z0 P) L+ u7 X, F0 k3 B7 U6 ~$ t7 i! P: C2 ]% p1 P
    7 L9 Q$ Q5 x# P0 Y$ z  v' l5 ~9 X
    1 r% }2 o9 L- P& P
    C++编译后,Base类的虚函数表如下:+ {+ ?6 |1 h2 q! W. O4 W. a
    [backcolor=white !important][size=1em]PHP code
    ' I# b; ], v3 G# S+ ~, S% J
    [color=white !important][size=1em]?
    % d3 L  c6 X5 ]. D) h% L. O
    [size=1em]1

    " e/ A# r8 v* S$ C+ `
    [size=1em]2

    ! Q2 {$ o. z6 u) Q1 T
    [size=1em]3

    & j' A2 }3 f) T9 H; X& B8 _7 H& f" j
    [size=1em]4
    % W. I% v- N5 z' r. t# ]
    [size=1em][size=1em]  
    0 N( T, K% Q6 R, X1 G* P[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    + F" ]" E5 C) Q[size=1em]vTable:InterfaceU1 |Base::func1()|
      G4 g+ n; A5 {[size=1em]vTable:InterfaceU2 |Base::func2()|
    $ ~/ d7 u  O/ `) B  o/ `7 f& W$ i$ p) W' n

    6 i* K  Q" o( B0 h3 b. Z; S) G; W% I  I% v4 h" H
    " Z( r( M$ u, l7 ~
    % \' q- d) m9 ^) v
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。5 H! M* S8 ^) ]
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。9 v7 y$ j, B+ {1 q
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    " ?: w0 g1 r4 e( H; x# x4 g- iC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定). J1 W6 Z+ S& R5 O+ u) n: e7 _

    ( l3 {  {! q6 Y4 H& p$ b
    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-8-5 17:15 , Processed in 0.424986 second(s), 54 queries .

    回顶部