QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2045|回复: 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
    5 [' T- J0 V6 Y  W7 E3 ~- J[size=1em]    InterfaceU1: s( V5 E( |# I
    [size=1em]{
    % s, K/ N8 P' H8 o$ `( W[size=1em]public:* E( H+ }" X9 l$ L3 X
    [size=1em]    virtual void func1() = 0;5 W/ M& N8 w) q& \
    [size=1em]}/ E+ {9 c9 C5 i9 L, B
    ! `0 _, {- u  w
    [size=1em]class
    * _& U, M+ t4 A# ]. J" b" p! n[size=1em]    InterfaceU2
    : R1 c5 t; K) s, v[size=1em]{  [+ a' }# r- O* |0 z# `
    [size=1em]public:
    5 _+ A7 b4 u0 O' }$ y8 w0 O) f[size=1em]    virtual void func2() = 0;! `* M- H, \9 F' A1 h
    [size=1em]}
    0 c! N- n, O: O( F- x. i7 i& k0 g5 t& G
    [size=1em]class
    % U/ T" m2 f, i1 U' c1 C* }: d+ {[size=1em]    Wrapper& U/ y+ ~* Y4 u. }; [
    [size=1em]{
    - V) _. T4 ?- f) Y2 h) P[size=1em]public:
    , R2 ~: a1 F* N+ i1 N: A: t[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    ) [1 V' s  X# m0 U8 R0 n5 |1 m[size=1em]    virtual InterfaceU2* getInterface2() = 0;  [( V" I3 c& F
    [size=1em]}. H; M/ r$ {- X7 A4 X& S1 Q
    4 U8 ]' l% q1 S. f( O2 u. {9 k
    [size=1em]class
    * f4 s; h; h+ t) E- p[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    - I0 Q3 O6 c+ e9 o+ Q- Z# X[size=1em]{
    ; |: {& \: B" H- a/ I! @' N, \8 ~[size=1em]public:3 h' Q! [- l) q. T1 F2 h
    [size=1em]    virtual InterfaceU1* getInterface1()) {* B1 g! m" S: S8 U6 n) Z; r
    [size=1em]    {6 C/ j( K- R5 g" G/ S
    [size=1em]        return this;
    # u' s0 j" P2 e" }, F; w# |/ S[size=1em]    }
    7 D* ]4 y6 z* c. N[size=1em]    virtual InterfaceU2* getInterface2()' [2 n% h1 J/ P( W: @- v
    [size=1em]    {
    - ?6 J4 w" Q6 `
    1 i0 U9 t1 @0 N  I9 \[size=1em]        return this;/ g. Y% g1 k5 O/ k& w! p- j
    [size=1em]    }
    5 i6 x$ x1 P2 L) j' F6 R[size=1em]    virtual void func1()
    1 A0 _: e: A" H. q[size=1em]    {
    / p+ w3 D) o. P( Y  j0 k" e- M[size=1em]        printf("%s", "func1");8 v  O" Z3 b2 m8 a
    [size=1em]    }! G% A1 G. Y# G4 w7 J$ x: _. l! Y

      s) s2 U9 X& z[size=1em]    virtual void func2()! w: z3 G6 A( G* C9 s9 u9 C# Y
    [size=1em]    {* r, O8 k% ^) \- |
    [size=1em]        printf("%s", "func2");0 h! p( w8 s2 N- O
    [size=1em]    }. C3 O5 Y* I% o8 y6 @0 ]
    [size=1em]}
    + ?0 [) [$ {: m' S5 R/ F% h% M* X/ _: ^

    " a  C7 F: x2 S2 t! L$ B6 E! r, O

    2 l2 r/ e; k9 U- r+ S$ C+ \9 Q$ \+ D! K5 r* m+ ?
    假设有如下代码:
    " D7 D$ r% U# F6 q( _4 G[backcolor=white !important][size=1em]PHP code% W- q5 F( }) Y7 L  D$ m
    [color=white !important][size=1em]?

    ; {4 I9 M2 _" ?+ h
    [size=1em]1

      Z" v/ M: H" L
    [size=1em]2

    : G0 Y4 F' [6 Z9 G; j) ]  o3 A$ R7 H
    [size=1em][size=1em]Base* pBase = new Base();  E3 X$ d' j/ q( b7 `. o
    [size=1em]pBase->getInterface1()->func1();# m# E) z  i+ Q3 k- f  E$ t

    * W2 U& \! |4 I) x, r

    / \. S, x- {" M9 T0 O9 z! O$ f1 }7 `3 t: F6 [
    / m3 C# U& q, t& G4 Y) o
    其实以上代码等于:
    6 q6 S5 R5 {6 d) d& f, a5 \( n[backcolor=white !important][size=1em]PHP code' M5 m! ^/ ~- @( ~, m+ |
    [color=white !important][size=1em]?

    $ I. e9 R3 l, A
    [size=1em]1
    ; z$ |' Z+ y6 o2 }9 ?, @" H7 d
    [size=1em]2
    - Q, z; A6 w" j0 ], f+ {9 ?# B. J
    [size=1em]3
    + Z/ s- i4 R9 ?8 w' v/ y
    [size=1em][size=1em]Base* pBase = new Base();3 E+ e0 |6 `! ~- j( T
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    8 [8 S0 @+ N. y( V5 H8 j[size=1em]pInterface1->func1();, D0 x8 V" L0 q3 c/ D  u) \( i% n
      U# b7 J$ d8 I# W; `$ @5 C) s

    " f! W7 y- i4 Y6 E: i9 F; o# u  T
    6 D7 ^( F! _3 k; l7 c0 F, l6 W( O& L
    3 E& D5 N5 V" D! d5 {$ [

      p8 R1 F0 G" Y- {' m" wC++编译后,Base类的虚函数表如下:& W6 P8 F* a% s& Y$ q; V+ I( H
    [backcolor=white !important][size=1em]PHP code/ a, r. @- w/ R; m
    [color=white !important][size=1em]?

    6 l5 x  j& X+ ~' q2 B* }! @% V
    [size=1em]1
    9 `9 D) E+ v3 {( h- {
    [size=1em]2

    % J" w7 N' r- ]9 _( l" M% D
    [size=1em]3

    7 q* B' I+ G( A3 T- [( x6 k
    [size=1em]4

    - M$ O3 j& X- `% F9 p0 x
    [size=1em][size=1em]  7 G' C+ k: Z8 x' g& D  C
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    1 ~& T7 G/ S& ?  T" N1 F; F$ i[size=1em]vTable:InterfaceU1 |Base::func1()|
    $ z- ]/ x* Q& K3 `& o5 L[size=1em]vTable:InterfaceU2 |Base::func2()|
    / e" R9 z" c2 K# V
    - c7 Y7 e- ^" W4 g# K
    + X) b# Y5 ?0 D  i6 N3 [# U
    5 I0 A6 z9 x1 z! ^8 ?3 J+ N5 D# S, s  q

    2 u2 ^/ r: b# \1 a0 R
    * J5 t1 O3 [$ c* i2 ]3 Z& h如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。+ }0 I$ g; ?" y# @, Q1 Z4 @% L& v/ _
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。1 z: A; M$ I2 h5 R
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?9 ~$ h& G$ c  y& Z9 _4 A( ~. O9 Y3 O. r
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)7 {6 E3 T* q: A# C

    4 b' i. ?; j2 K+ C  n
    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-6-18 07:42 , Processed in 0.414655 second(s), 54 queries .

    回顶部