QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1567|回复: 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 ^. ~( z; q' ]8 `& |[size=1em]    InterfaceU1- ]  J2 t/ i! n* x" R
    [size=1em]{, T4 ]1 F+ N' b* |. b
    [size=1em]public:
    , V3 Y: D3 ]6 J- j- ?7 ]! A[size=1em]    virtual void func1() = 0;; v5 Y  R, Y. }' o' n
    [size=1em]}
    ( }/ T+ X$ F% |' Z: ^
    7 X" f  r# I2 R2 I. K" Q4 L% f  o9 P[size=1em]class& v: \! j5 `* w; `
    [size=1em]    InterfaceU2
    7 {- o0 V9 I3 Z: z[size=1em]{. }; d" R/ K9 q/ i/ O
    [size=1em]public:
    . S- v1 g+ ~8 R) Q. i/ e[size=1em]    virtual void func2() = 0;
    ( _) k( p) \/ C, _; R; X& `[size=1em]}  H( E5 z3 }* V. A9 M5 S

    2 C% B+ u3 K8 n' c* Z4 H[size=1em]class: |3 |. r& M2 o
    [size=1em]    Wrapper/ u: L6 \  U$ v8 u: J6 O. l' e
    [size=1em]{& a& \2 j: i9 Z/ ], j# \( U
    [size=1em]public:* l6 b  p% i2 f
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;5 ?" ]& V2 A% v1 [
    [size=1em]    virtual InterfaceU2* getInterface2() = 0;& Y* c+ \+ t9 `5 {* D# E9 V" I: v
    [size=1em]}" ?" A' h, e9 J' F+ ?
      Z& x# Q; p5 a' `4 F
    [size=1em]class
    # \- z) F2 c0 O' _7 L+ T' k[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    7 O1 s1 X* c5 j6 n7 q[size=1em]{  n( [3 Y6 Q1 k! C
    [size=1em]public:
    . s5 ^' }' E* _$ Q) v: C* K6 |8 S[size=1em]    virtual InterfaceU1* getInterface1()7 p3 @8 h3 d1 n, D  {8 |9 |
    [size=1em]    {
    8 V, V5 _' {9 ~: B7 Y4 C[size=1em]        return this;
    ( f2 F9 {+ u8 o( m[size=1em]    }
    5 r& o; E  B# f; U[size=1em]    virtual InterfaceU2* getInterface2()
    : m. E! Z6 @' Z: N8 y8 Y% E" r( Q# ~[size=1em]    {
    2 l8 c- Q, h0 J. M+ \8 s8 _# \- [! m9 w7 y$ g1 Z0 V
    [size=1em]        return this;; D" H# O& M4 P1 Q/ v
    [size=1em]    }5 B! ~; l5 N- c) J
    [size=1em]    virtual void func1()
    / H5 `0 x2 }) g3 o2 N3 V! }[size=1em]    {
    " m, U6 ?0 R0 T[size=1em]        printf("%s", "func1");/ ^: r$ s# M; \+ G6 x6 c& W3 o
    [size=1em]    }
    1 f7 Z, e' t  e* Z6 k$ M0 k4 C3 X+ k9 _2 h: D$ n1 L. T
    [size=1em]    virtual void func2()9 d" R/ u8 ^8 F% N
    [size=1em]    {2 O- A0 H. G: `# x  \
    [size=1em]        printf("%s", "func2");" v9 y5 }: e) @6 k& V9 [* @* B( y
    [size=1em]    }
    ! O9 v5 {& O4 u[size=1em]}$ q" }1 R3 A; _' T& C
    ; q1 b' Z/ {& ^! x9 W
    3 L9 {  N! h8 F6 }: }
    3 r1 w& x0 r  e. [

    " n$ V$ i( G& x) F. M+ U假设有如下代码:6 v4 g6 ^0 Z0 Z: n' e9 t2 V% ]8 @
    [backcolor=white !important][size=1em]PHP code3 U: d/ G" d0 O0 ^
    [color=white !important][size=1em]?

    ! ^8 S+ V! U' c+ c. P' C
    [size=1em]1
    2 K7 t8 `2 y4 I9 _) K. w
    [size=1em]2
    $ M. U' \" A  f$ e& o4 b
    [size=1em][size=1em]Base* pBase = new Base();
    ) S4 i: |7 h( y% A" r+ D" H/ N' X% t[size=1em]pBase->getInterface1()->func1();
    # {* {. X$ @" u" ?* H. v) V
    % K( {& F5 }: _) V( v+ A% U9 d
    * W) c1 `- E* r! c8 Z
    ! E1 C) g1 T( ]4 \6 w
    2 r% I1 B* q: W- p, C1 r9 n  C9 q
    其实以上代码等于:
    / d4 n+ c8 C; T4 r1 Z5 O[backcolor=white !important][size=1em]PHP code
    6 V+ z5 X& a) \! c' A$ R0 [. u
    [color=white !important][size=1em]?

    1 `% \: A+ @0 N( V; o3 I
    [size=1em]1

    6 ~4 \2 J2 M+ W* O. m0 z3 |
    [size=1em]2
    % U8 ^  w, M, l: E8 F: [. B& {
    [size=1em]3

    / z3 R& Y0 C# ^4 F0 {! O# l9 ~# \- ?
    [size=1em][size=1em]Base* pBase = new Base();
    ! ~7 K+ D% @8 B# i[size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();4 ^* j8 a9 m/ X1 r
    [size=1em]pInterface1->func1();
    6 `& p# F# Z8 O: q
    7 _8 i+ I6 J5 S/ r3 w; t4 v

    8 p6 K6 C6 I- c0 w$ ^
    * \% I, L3 `' g2 r7 \* X: |+ e* K6 }) j+ R: H
    * }  w$ E" T# `; Y
    " X- W5 w. j+ a
    C++编译后,Base类的虚函数表如下:1 X  Q7 K7 F4 L5 S4 j. z
    [backcolor=white !important][size=1em]PHP code. k* M$ T: d! J0 h. u
    [color=white !important][size=1em]?

    ' ~& w9 {5 }; u& D; E. ~4 Z0 d
    [size=1em]1
    # Q, S5 ^- V3 e2 Q; b. x% h
    [size=1em]2

    9 g" W( r. G1 i, T/ _
    [size=1em]3

    0 ^3 R; e$ l/ n( `# \* w% d
    [size=1em]4
    0 D4 W; z/ ~' }' t
    [size=1em][size=1em]  
    6 _) _% I0 s( G! _/ \/ j9 B; {[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
      z5 g5 y3 Z0 ][size=1em]vTable:InterfaceU1 |Base::func1()|
      E1 x4 h& [3 Z# D  V[size=1em]vTable:InterfaceU2 |Base::func2()|
    6 P' S9 u5 C% J8 {( X" ^# {
    1 [; p& \+ y! {2 b

    8 E2 Z6 A. H  h) e! e3 g% i# @9 B3 i2 ]) [- \. l
    9 ]" j) w* r- E6 z8 S' x
    8 V; a+ f8 h0 m
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。" Q) P$ z- E$ T" l- H6 N
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
      A$ m8 A8 x1 @% r& L9 F: sC++是如何得到当前应该使用vptr[??]位置的函数地址呢?& f" k" j# ^9 ]5 I# U2 ]5 t
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)3 t% G5 n" ~' E3 f5 _
      C) R* x1 H: ]5 \
    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-6-18 13:44 , Processed in 0.372662 second(s), 54 queries .

    回顶部