QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2017|回复: 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
    # [$ I! k* ~6 }' c6 C[size=1em]    InterfaceU18 G1 N6 E0 _2 c- T5 `! o. {* T
    [size=1em]{3 X  N$ d2 G4 d" t" f4 W/ z
    [size=1em]public:+ j3 @* E2 B9 h, Q# y: x7 }6 w: Q
    [size=1em]    virtual void func1() = 0;" o, B; w" c2 R9 v+ q- j
    [size=1em]}
    ) |2 m; u/ ^1 B+ x
    ! [- m; d2 _8 N, c  P[size=1em]class. u0 I' y7 k4 z; J& E
    [size=1em]    InterfaceU20 b8 x5 @9 V  \5 k: Q0 a8 E
    [size=1em]{
    8 [" ^; n5 ^# F2 t% v: b' E[size=1em]public:8 V; V; R( V; z' j
    [size=1em]    virtual void func2() = 0;
    & {5 R# o0 E1 y+ ]! [' g[size=1em]}
    * v0 {: C5 H# }& }1 V# O5 Y! o3 q" M" K
    [size=1em]class
    0 }6 f# b2 i  N1 K9 \4 N[size=1em]    Wrapper
    $ o( Z0 x6 g; e3 D# y[size=1em]{: y; \" n1 H; j9 m
    [size=1em]public:
    7 T: W' c* T! e' s: ?9 j  Q, ?& m' n[size=1em]    virtual InterfaceU1* getInterface1() = 0;
    7 Z9 a- M( O! g, a6 J[size=1em]    virtual InterfaceU2* getInterface2() = 0;
    : r8 c: q. I+ M6 `# _% m( E& n[size=1em]}, x' W% I! S+ [5 ?4 U  B! K
    1 Y% h2 C7 [% ?1 T2 K2 S2 p9 \9 F
    [size=1em]class
    ( f4 a5 q5 O! H9 i( B# L3 f[size=1em]    Base : public Wrapper, public InterfaceU1, public InterfaceU2
    2 u4 _. r4 h6 f# h[size=1em]{6 e5 }2 W# N* F: k; f# ~
    [size=1em]public:4 d& t$ l" M8 B* L
    [size=1em]    virtual InterfaceU1* getInterface1()% S0 k0 ~$ w1 A4 s. p
    [size=1em]    {
    4 P9 b7 z8 l/ @5 Y$ w[size=1em]        return this;
    ( r. r" X* _3 l[size=1em]    }
    1 C1 r  n; P# _# E+ u[size=1em]    virtual InterfaceU2* getInterface2()
    5 s/ S; }3 o/ k  y6 F7 w[size=1em]    {' O( |9 w" O6 \( |% x

    7 U0 b5 w2 w4 |7 L: p[size=1em]        return this;" a5 S# F6 @# s- `( H
    [size=1em]    }1 g- }4 ~$ h0 O7 E
    [size=1em]    virtual void func1(), b* ~8 u9 T) A, v
    [size=1em]    {
    8 X% M4 P. J, m, _2 L. C[size=1em]        printf("%s", "func1");; E/ u7 F1 [) ?
    [size=1em]    }
    3 E$ ]- F5 h) ~. [, H& E3 ]3 p9 V* S: A5 N9 }# N4 C3 J1 o7 ^# T
    [size=1em]    virtual void func2()
    7 @& e. X% p7 O& U[size=1em]    {+ a( M0 O" y" W6 p) o' G$ ]
    [size=1em]        printf("%s", "func2");: t9 {6 M1 O0 ]
    [size=1em]    }' P2 d. F4 `6 c' |3 \
    [size=1em]}8 O- E+ X1 {- \( M. @+ R# X7 t

    4 G* g$ y) h' `, S7 ?; e
    , D7 P. {& ^* l, n5 U6 R: @" \
    9 m" o# {) H1 B, G/ v9 {, |* G
    : S" \; g5 M: h3 E9 R
    假设有如下代码:
    ! X4 k+ A- s$ t[backcolor=white !important][size=1em]PHP code% B* i! w) e. h( {2 ^  e
    [color=white !important][size=1em]?

    2 O. V( A% `( V: o
    [size=1em]1
    - h9 P% X0 k" E3 h. b0 ~1 z. t
    [size=1em]2

    ' i" W! f  p6 M0 e
    [size=1em][size=1em]Base* pBase = new Base();
    ! J( L" d" W* ~. b4 ^8 b: l& O[size=1em]pBase->getInterface1()->func1();
    " w4 N3 ^: O; J9 X1 j7 z- z
    * S# E+ a9 U6 \
    & \  ^: \  N$ `% O6 a
    3 g7 h& ~9 m* K& _: X' ^

    2 x; Q# i7 h( @" A3 Q# i2 g其实以上代码等于:
    ! U8 k9 M8 N% l( ~. j6 Z+ k[backcolor=white !important][size=1em]PHP code) V% k1 |) g) ~
    [color=white !important][size=1em]?
    9 I: W* F3 p, `/ q$ a
    [size=1em]1
    ; D8 q% J; }- C' S2 ~# ~
    [size=1em]2
    4 t5 {% J6 H5 X' Y4 |4 U/ n
    [size=1em]3
    8 r2 D: W2 {) G$ o0 j* F0 [3 Q
    [size=1em][size=1em]Base* pBase = new Base();
    2 P& h9 \% b7 {  ][size=1em]InterfaceU1* pInterface1 = pBase->getInterface1();
    # \" B& z( n6 d; N[size=1em]pInterface1->func1();2 X. M  l$ d0 E6 K. C9 Y3 D# j6 t

    0 {4 A4 x5 h. {* h7 ~
    ' g; ^' l' o3 W7 y
    ! U; W3 f9 Q* k! c0 ~0 E: }$ N

    8 y3 a5 o6 {  ^, X2 P& X" n/ o% u7 N. f1 z( a6 p! O+ }) Y2 `
    ; Y% n* m. M3 ^7 x
    C++编译后,Base类的虚函数表如下:
    3 H* u8 T2 |2 O+ M7 G0 f* s[backcolor=white !important][size=1em]PHP code, m7 R, A1 U/ y" k! F
    [color=white !important][size=1em]?
    5 {2 \& t* a7 i, z
    [size=1em]1

    & {6 C8 q$ t! h4 F5 v
    [size=1em]2
    " a. v. I: |, l+ n3 r5 Q/ I" n
    [size=1em]3

    9 x% Q$ x# Y7 Z2 Y. R" |
    [size=1em]4
    - i7 C. {1 v2 g0 P; D+ z
    [size=1em][size=1em]  
    0 H$ \' U% j5 u[size=1em]vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
    , p0 Y- J% [3 M! Q. F) P[size=1em]vTable:InterfaceU1 |Base::func1()|$ W. e! G" n8 |+ G0 R% c1 H5 j
    [size=1em]vTable:InterfaceU2 |Base::func2()|
    7 ^6 x: ]: u6 n2 m; }! {2 @3 t+ |! b% p

    " b8 p& N/ v+ U2 K8 }$ [& ?$ E1 c* n: T) u1 e3 c$ d1 m! y

    ( w( k  A, W: A' N, p7 g. d! P6 Y% v$ v/ e
    如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
    2 \7 _% d0 X5 E3 `但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr[0] 则完全错误。
    ; z  m& l, X% f# |1 {5 MC++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    & B6 q- t8 T( [4 h2 MC++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)+ }9 a9 U5 i7 ]0 I" L

    : I- x& ?& Y0 k7 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-4-18 10:35 , Processed in 0.409668 second(s), 54 queries .

    回顶部