QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2072|回复: 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]class0 z# r8 }  D: {2 ]8 w! A$ a9 N
    [size=1em]    InterfaceU1. C# `+ k% X1 s
    [size=1em]{
    % G1 J, A9 r" d/ |[size=1em]public:* E) s* |% }. L, h! o
    [size=1em]    virtual void func1() = 0;- R' K0 [1 Z9 `: s
    [size=1em]}
    4 h2 _' v3 F" D7 g' I# c' P6 C; e( a3 D7 D: M  Z5 l% z1 K( f/ @
    [size=1em]class2 l/ I- S6 a) M7 `9 ^, G" M2 M
    [size=1em]    InterfaceU2( W, n* T/ q; V2 N% S. n- b- V
    [size=1em]{6 u- I# G, |+ v/ l8 b4 r" v
    [size=1em]public:
    + l3 \( r1 U) V3 x! o: s[size=1em]    virtual void func2() = 0;
    , K5 ~) [0 D; |/ Y! c, x[size=1em]}
    7 n5 M, p* N1 M+ c7 k: T9 e3 O  q& ~) d) F5 R0 f
    [size=1em]class
    7 K) }4 u  s' v* X8 b[size=1em]    Wrapper
    + P8 k" Z3 B+ F2 q1 x[size=1em]{
    - j8 v$ r$ _8 \! {' W/ ?9 C[size=1em]public:5 w# F$ q6 X: `$ c' o8 R  e
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;
      u9 h" q4 @) B: E0 F+ P* B[size=1em]    virtual InterfaceU2* getInterface2() = 0;% l* R( F8 b5 D2 u6 j* y; Z- X6 `
    [size=1em]}
    / r" X1 S8 ^( ]# l. C4 z3 H( w; P
    : h) X3 O: G' k/ t; U% E; X9 i[size=1em]class
    * J  m% [, q* g1 n; H( P[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    1 Y) D& y& w8 g% B3 M; ]; b+ P  F[size=1em]{
    2 K$ e+ w# o6 t[size=1em]public:
    0 N2 T' S, z$ D8 {) v( p/ w( ][size=1em]    virtual InterfaceU1* getInterface1()6 B- t! o* X. ?/ Q$ i! b: w
    [size=1em]    {8 w) A5 H& t. l) X
    [size=1em]        return this;) O2 l4 C- X0 s5 d; |; e
    [size=1em]    }
    8 l+ O: Q; ?2 W% R[size=1em]    virtual InterfaceU2* getInterface2()
    . d2 G( _7 D" a6 H* v[size=1em]    {% [% O2 s% x2 b0 U  L

    $ S" p' y7 z& b+ i. e. W5 U[size=1em]        return this;
    . X! o# E3 i2 Q% A/ ^+ J[size=1em]    }
    " B  l  b  x- o2 E2 X[size=1em]    virtual void func1()7 w" U$ N4 A6 [8 i9 k8 S
    [size=1em]    {
    7 b5 j3 x8 `- b3 S[size=1em]        printf("%s", "func1");& N/ p" j# E) ~3 _+ `+ h
    [size=1em]    }
    % y/ ?" A) j0 c7 |$ o  h- [7 }' X7 z! {6 g1 p  R5 U
    [size=1em]    virtual void func2()
    + L: P. ~- @4 |[size=1em]    {
    4 i. w% q! {" v; i& J; ][size=1em]        printf("%s", "func2");
    9 Q/ u) f3 b: V0 n- ^3 H# b5 ^# e8 M[size=1em]    }
    $ `1 y, d' @* E9 `[size=1em]}
    & d7 O* u+ I. F
    ' d9 S; h2 k6 _/ `( M6 k

    % u* _& U9 }$ b7 [; L7 a

    # f: X5 r- `/ j. o8 ]# ^5 \0 g5 @% a$ s. B
    假设有如下代码:
    # y5 G! [2 {* f' C( J9 [[backcolor=white !important][size=1em]PHP code
    4 u' W- n- a4 {. Y9 I
    [color=white !important][size=1em]?

    . p% e: o5 Y8 K( Q+ M
    [size=1em]1

    7 I0 z. m5 _: k8 L  ~
    [size=1em]2
    9 u/ b* x/ `# W$ d0 Y% h, Q0 {; V
    [size=1em][size=1em]Base* pBase = new Base();% t* q9 I$ L. w
    [size=1em]pBase->getInterface1()->func1();
    " W# }3 M# p' o9 U0 [
    3 _  S8 R# m8 N( {  H3 m
    8 R$ d7 {2 }6 j/ M3 N- u8 v! W

    1 }% u8 e3 y; G, y0 z  ]+ s% O0 M' \' D
    其实以上代码等于:
      d' \6 B7 `* a! ~! Q$ f. l) `[backcolor=white !important][size=1em]PHP code8 k  J8 I5 e( T. }% |! z' L
    [color=white !important][size=1em]?

    1 {4 X' c2 U& Y
    [size=1em]1
    , D0 G& R' C; x% c! [) U
    [size=1em]2
      s. t1 l5 M% _" g/ a& F' C
    [size=1em]3

    9 H- g) o6 G, x
    [size=1em][size=1em]Base* pBase = new Base();1 @- h5 L3 w- K4 z. }! W; i) ], J
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    9 g" ?2 |! ?! y( e: N[size=1em]pInterface1->func1();
    ) |; ^0 ?5 A- U, @0 x( Q% a/ }' N6 ?1 D# e
    / m$ p1 }3 R+ `6 U" x
    ! k7 ^6 S! t) a
    9 Z$ P, M6 ?# U; J
    # h- \$ d0 X7 M
    - y- S9 ~4 {; q( f( O3 z  ~
    6 A% O1 ]( W- Z( m# l& {0 h
    C++编译后,Base类的虚函数表如下:
    * w: D+ M4 l) H0 |, V, [1 _0 F. A[backcolor=white !important][size=1em]PHP code
    0 i+ p4 O& {! p. E8 k5 b. Y
    [color=white !important][size=1em]?
    . W' s' Y4 ?! S. G, o
    [size=1em]1

    ( Q! K: B  o5 v; D6 `
    [size=1em]2

    $ A/ U, [; f0 ?9 H
    [size=1em]3

    " ~) H: ?7 u% h& |  `# Y
    [size=1em]4

    8 X& G" K7 x9 {3 u4 ?
    [size=1em][size=1em]  * t3 e2 |2 f6 {/ }0 I) j
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|6 q1 u+ P2 T% S% F# K# `5 P! K
    [size=1em]vTable:InterfaceU1 |Base::func1()|) M9 |1 ^6 \% y7 T$ Y
    [size=1em]vTable:InterfaceU2 |Base::func2()|0 P0 Q3 e; J2 G% G$ `6 R

      O; d. x/ e/ v) X: p; B
      X0 @: E: u" |. r

    $ v; Y5 l$ ]. v7 P/ R; d; X/ y6 w: {3 v# v
    8 e% r/ k6 {' q
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。( N+ w/ \3 r; C  i) Z& L9 n
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。( s- ~8 }3 [  y, h- a5 T
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?8 l4 f- k6 l* ?) j  n, c- U* w
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)' _, d& K  N# r8 S6 M9 G

    ; x* u/ q& H7 }. F3 O% r$ \
    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-6 02:20 , Processed in 0.472618 second(s), 54 queries .

    回顶部