QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2035|回复: 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]class3 z5 W8 p8 A+ C; f! O6 z8 Y4 [
    [size=1em]    InterfaceU1
    $ A; |% E* p) ^' L[size=1em]{- W% C: l5 X, _3 D. g, N# d
    [size=1em]public:
    2 k- o$ b( x+ ?# t- L7 p% M- i[size=1em]    virtual void func1() = 0;9 i: R9 _! f/ l7 Y; W0 B: L, Y- g
    [size=1em]}% M0 M5 b0 l( q9 v, G( y7 L8 r- ]3 O
    " H, L7 Y0 _& ?3 Q6 {$ P( L- @
    [size=1em]class
    1 {3 @8 `% E4 z% s[size=1em]    InterfaceU2
    # k+ i+ X2 K. M[size=1em]{
    1 W/ u( w$ ~) H, }' r; p  i8 r9 q[size=1em]public:4 c: k) C+ f) X2 Z4 G4 a
    [size=1em]    virtual void func2() = 0;! r% e9 `8 U! G3 y, h" ]5 R; A
    [size=1em]}
    7 f$ k) `" z; M) T3 f* m4 k8 p7 E6 R6 t, f9 c
    [size=1em]class
    . ~9 x' `: {+ f" h[size=1em]    Wrapper
    ' [/ W3 o* z1 e) |: O% ^& \  W[size=1em]{& t5 e2 f0 ~9 ?& }( U6 V7 V+ b
    [size=1em]public:
    $ w5 i. Z- g8 p4 f9 B) P. `- M4 }[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    3 X$ i( p! L. o4 F[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    * Y/ _7 N! Z7 ~2 i( U2 t/ ][size=1em]}; M4 i$ D+ b( }$ k
    . R% \: _: i8 h1 ?4 L2 H
    [size=1em]class8 p  q5 X/ V( V& P% w. V1 |5 Y8 C
    [size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2: }0 l& Z0 p& S" T! c3 G
    [size=1em]{/ }2 g- E3 }- ~
    [size=1em]public:0 t6 s( P2 V) f- J  {# g
    [size=1em]    virtual InterfaceU1* getInterface1()
      F) _( z2 ^% `3 [# B& x5 a4 _[size=1em]    {
    9 B/ X. A5 p( q/ m8 S[size=1em]        return this;+ W. E) ?& v5 R1 n. o( J
    [size=1em]    }
    ; Z! d2 D, \) k( X+ u[size=1em]    virtual InterfaceU2* getInterface2()
    5 }( M) s" S0 B  ~# Z' x0 I) Y[size=1em]    {$ k/ }6 v3 D: Q3 |
    ' J9 `1 k! W. v  U$ a
    [size=1em]        return this;! Y8 ^( `' R; W0 V6 Y  T/ B' f
    [size=1em]    }
    ; Z0 e. r$ d1 G# p0 i. L) ?" V' f[size=1em]    virtual void func1()
    . o! E: p1 h/ f" {1 C0 }[size=1em]    {
    2 ^* R, I8 n) x; }+ e. ^[size=1em]        printf("%s", "func1");7 ]' k1 P6 L' y7 B2 ?
    [size=1em]    }$ Q1 x1 M: s5 v& ~+ A- t

    7 }( u0 }* g( C! L2 i[size=1em]    virtual void func2()
    ' \6 J/ D; `9 ^' x' J. E; @% }" S[size=1em]    {; a2 n  x0 u0 f  \% H
    [size=1em]        printf("%s", "func2");
    9 x  k5 ]! {( {9 p( N. @0 X[size=1em]    }6 x7 d& e5 v. `/ j  m& x' y/ P
    [size=1em]}
    / D5 @3 \: y0 g5 a. g- q1 L7 a
    2 Z. @! ?  q" S! P3 w; s. c& T
    ( r' W( @' c* O# s+ ~$ {# O
    9 M2 L: n: f. g1 }2 a
    % X( A& _: c* \9 J- F; {
    假设有如下代码:7 G( j0 v8 [  e  l. L, v. d
    [backcolor=white !important][size=1em]PHP code1 u# ~& l8 i, f0 n& |  Y
    [color=white !important][size=1em]?

    # `0 p7 V0 Y1 j" j& Y* ~
    [size=1em]1
    ; g1 z. q2 A( Y5 `7 x9 @
    [size=1em]2

    3 P+ _; A9 f  [  j% D, S
    [size=1em][size=1em]Base* pBase = new Base();
    ( D: [5 R! L' |: Z! A+ E7 C" u0 u[size=1em]pBase->getInterface1()->func1();
    1 T3 n' V! p: K
    $ J2 A; b' y3 d4 `* C0 Y
    ) J! T- p2 v5 f; e+ S
    9 F; v* q# A5 ]6 Z2 ?. |

    2 X! {1 \0 }7 O, {$ Q1 `其实以上代码等于:  l2 Z$ ?; J! q' v  J0 X
    [backcolor=white !important][size=1em]PHP code
    . f0 ~' @2 c  k) A( ~. [
    [color=white !important][size=1em]?
    : g9 j! L/ s3 j  O$ l
    [size=1em]1

    ) ], @- E  h! ^) C* Z; Z
    [size=1em]2

    & k' l% K) t0 \0 G+ C
    [size=1em]3
    ) D/ j7 J- t8 B0 W' _
    [size=1em][size=1em]Base* pBase = new Base();3 ]9 d0 `; I$ R: _5 W% b- H
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();  C, Q$ L/ L) w9 Z+ M+ i
    [size=1em]pInterface1->func1();* Z$ Y3 a- D! v
    9 k1 `3 v+ V- T4 k
    - k, j# j& W+ e! c

    * D4 p! t3 J4 |9 K# F4 ]( `' o+ R1 M  a
    2 G$ ~- l! Z* r- n* ]
    ! c  V, \, w  g4 @) `% k
    C++编译后,Base类的虚函数表如下:/ u1 a6 A7 O! C8 M) u# f
    [backcolor=white !important][size=1em]PHP code1 l  D) D, K/ ?6 @; {2 p- N
    [color=white !important][size=1em]?
    4 \% Z- p' t% ]1 a
    [size=1em]1
    & Z  l; w) k4 n8 e, b1 O+ i
    [size=1em]2
    3 S, M! @7 C) B; a9 Z
    [size=1em]3

    % R9 i6 ^- t" [( b
    [size=1em]4
    + ^" q3 O, V- q+ C7 G
    [size=1em][size=1em]  
    " f7 m8 f( W6 ?2 c( s1 s& s[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|& @, k7 e% i3 Q2 t& V6 j* Z* `! o/ I
    [size=1em]vTable:InterfaceU1 |Base::func1()|/ U0 P0 z) O; p$ ]2 v& \( D
    [size=1em]vTable:InterfaceU2 |Base::func2()|9 u: Z& F& D4 W( |9 R) W- H/ r2 J

    : C: f# i* e0 S3 r
    7 V; C" n5 P' L6 B6 D

    ( e) I7 _3 d8 _, c9 N; w6 W" f" f; p5 ]2 M: N8 h
    . ?# P3 ~) k0 s; _* p" h
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    ; B% ~9 l: u( B2 D' x- [7 R5 e但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。" d5 x6 L$ o* U$ X( t+ G
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?  z0 Y/ e) L6 `) l" K' q' D
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    2 O+ ^0 j5 {8 \  C4 l; U9 Z5 }. ?. N2 m3 T: \) c/ P1 }& ~
    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-5-27 06:17 , Processed in 0.355756 second(s), 53 queries .

    回顶部