QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2044|回复: 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 C8 m' c- ?' @+ g[size=1em]    InterfaceU1. S9 X* d$ U+ P
    [size=1em]{
    7 z& u! S! y/ L# g2 c1 s8 Z4 \[size=1em]public:7 S, C  E1 `% j0 V1 E3 P
    [size=1em]    virtual void func1() = 0;! U5 H0 G$ \6 \' ^
    [size=1em]}8 N7 f& \7 ?7 U% I

    % O% X  t, A5 B5 O' Q9 F" u[size=1em]class* q: u" ^8 q) J) ^: O. B3 {5 v
    [size=1em]    InterfaceU2
    % `0 w0 o5 u5 i[size=1em]{3 ]0 N2 d  a) H- [4 }0 S1 p
    [size=1em]public:
    7 k2 a+ s0 |$ }, H1 w& V[size=1em]    virtual void func2() = 0;
    : `6 i' z+ {7 G; O7 U8 i1 M[size=1em]}
    2 K( ~- a" D: i! z( h, ?. o
    $ T$ q% _6 R$ J% r" b/ \[size=1em]class
    - L: t8 w* @1 g1 w[size=1em]    Wrapper
    6 g! ^" D, U2 @9 ?[size=1em]{* M4 n" {& E5 X- i0 p7 T" p
    [size=1em]public:+ n7 `/ a; _: O+ ~- z$ H# U/ C
    [size=1em]    virtual InterfaceU1* getInterface1() = 0;
    ' U! {' L8 `6 U3 s2 k6 B[size=1em]    virtual InterfaceU2* getInterface2() = 0;
      x& r6 ?2 g' @: O0 n[size=1em]}$ w% U# i2 v; u& p) ?) g) S0 Z6 e
    . h* B; [/ H3 E6 q( D: @- m
    [size=1em]class
    ! L6 }" r( ^' X3 @% h! N8 x[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    1 O; I0 A, V7 ~. ~2 e. x" `[size=1em]{4 y" k4 o. b# I& _! ^& J9 c  G3 @
    [size=1em]public:, {6 Q8 ^7 O% N! M( Q- T" F2 q
    [size=1em]    virtual InterfaceU1* getInterface1(), ^# _& h0 i% l& K2 O
    [size=1em]    {# i0 C5 Z) B" ^/ _8 H2 z  g" k$ o
    [size=1em]        return this;
    4 |, j4 C; }7 B& N( E. e[size=1em]    }
    - g3 R5 v* t9 S[size=1em]    virtual InterfaceU2* getInterface2()
    ( U& J8 C# v4 n! Y( ~0 t$ o[size=1em]    {+ i+ R+ z$ b: n* h/ c

    # c* [- `- Z+ I/ H! t% r[size=1em]        return this;
    ' y4 g( G' o/ `2 @[size=1em]    }
    * k1 R4 R/ X- {[size=1em]    virtual void func1()
    ! H- x8 N# R( o9 W( D+ T  T[size=1em]    {
    6 X, E6 }8 R/ i& `  S[size=1em]        printf("%s", "func1");! [9 x& ^9 Z) g5 o( N( M
    [size=1em]    }2 g" i- Q3 y4 D: U* Y/ _& Y

    ) b1 a' v& Q8 m- W[size=1em]    virtual void func2()
    0 i( D" O9 J3 M[size=1em]    {% t3 J$ u, f$ ^( Q
    [size=1em]        printf("%s", "func2");( C2 r& B) K9 B5 B
    [size=1em]    }/ F# i; P7 [) L& o) A, N  L
    [size=1em]}
    ( W  P7 I. S: O  @3 l, `2 Y) m, A3 @$ L! F, v
    # f- ^( ^8 X' y+ D2 \

    + ]2 l2 k: I. a4 w- ]
    * U) u& N7 B* y) p假设有如下代码:& ?, f5 c/ D6 q" L
    [backcolor=white !important][size=1em]PHP code
    1 D) E; k# ]0 g9 s7 _  l( y
    [color=white !important][size=1em]?

    # L# S6 F! Y' `+ V! ]: X6 g
    [size=1em]1

    , a! [7 ]. Z9 e' F. K
    [size=1em]2
    & |3 e: c$ X6 l/ v4 K
    [size=1em][size=1em]Base* pBase = new Base();
    + ?- e% S( ~. o* |[size=1em]pBase->getInterface1()->func1();* M5 t( m5 l7 b0 g7 s* |0 w
    1 ]' b2 W0 A3 I& d! z

    % H5 {$ B  M* ?1 `6 x" `2 E
    * N+ `, Z) f/ _' Z  |& ?+ X3 ~$ X- D, S5 M- L- I
    其实以上代码等于:9 t6 O- j0 M  W- w: B& q" P# ?
    [backcolor=white !important][size=1em]PHP code# h0 N9 ]2 A4 O, c0 v1 r& R! ~4 _
    [color=white !important][size=1em]?

    7 a. z3 t% z) G1 d2 u$ i
    [size=1em]1

    . l7 K/ d2 k. l
    [size=1em]2

    ; N5 @, c& I; c' {- z- j
    [size=1em]3

    ( H. G% V- u9 k: b1 @
    [size=1em][size=1em]Base* pBase = new Base();. ?! ]! `7 w! P( {5 w9 v
    [size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();! T" s$ O; `8 t. f2 [6 P: r
    [size=1em]pInterface1->func1();7 h* @! s, T5 Z9 T, H0 |* [
    ) E" [6 ^$ K3 \; }& x3 H( d
    0 |. B1 I) _7 r/ H9 _

    3 Y' r9 G7 f; ?
    ' m8 w4 D. d: X9 ^# h6 v5 q/ r, I4 T0 L! r: h

    7 v  D9 B% W$ K: M* _1 `) j$ zC++编译后,Base类的虚函数表如下:9 c) d0 t6 e+ C4 X
    [backcolor=white !important][size=1em]PHP code
    5 |+ j( W9 x5 ~. w6 q
    [color=white !important][size=1em]?
    : @( S6 j3 d( {8 \
    [size=1em]1
    , p  U6 x. F8 I2 Q- f% s
    [size=1em]2

    6 t( x$ b, v9 O; `0 F0 s. r' O8 y
    [size=1em]3

    " j* D4 ?# V  Z) a. m2 h
    [size=1em]4
    , j! V/ |3 n. y4 l& J3 X$ I# k
    [size=1em][size=1em]  ) M  B; B( q8 L6 u+ G  r
    [size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    & D- }3 b6 B' W3 h; i8 u[size=1em]vTable:InterfaceU1 |Base::func1()|
    * \: V1 F4 x/ \- I" }. Y/ L[size=1em]vTable:InterfaceU2 |Base::func2()|; W. O7 ~. X, w. t- D& `
    ) E1 d0 E4 e2 O: O! Y% ^% R9 V

    7 `; A% u# G+ x3 p  @5 _
    - J; a2 Z; O* d2 c" [$ E6 V  K; k0 V5 _, ?

    5 x$ J- I' y, J& O& A4 Q0 A( x6 q) G如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    ' j: M9 x" g: F  N* c/ }0 Q0 Y但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。+ L3 X/ V; k, T9 D7 Y; {8 ~& m0 }
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?1 w9 f4 j% {. M* P9 {
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
    0 l/ p7 t  m  p
    8 \2 H' Q6 m7 f+ N% 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-6-17 02:15 , Processed in 0.412670 second(s), 53 queries .

    回顶部