c++ dynamic binding

Upload: ssanagav

Post on 02-Jun-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/10/2019 C++ dynamic binding

    1/14

    T h e C + + P r o g r a m m i n g

    L a n g u a g e

    D y n a m i c B i n d i n g

    O u t l i n e

    M o t i v a t i o n

    D y n a m i c v s . S t a t i c B i n d i n g

    S h a p e E x a m p l e

    C a l l i n g M e c h a n i s m s

    D o w n c a s t i n g

    R u n - T i m e T y p e I d e n t i c a t i o n

    S u m m a r y

    1

    M o t i v a t i o n

    W h e n d e s i g n i n g a s y s t e m i t i s o f t e n t h e

    c a s e t h a t d e v e l o p e r s :

    1 . K n o w w h a t c l a s s i n t e r f a c e s t h e y w a n t , w i t h o u t

    p r e c i s e l y k n o w i n g t h e m o s t s u i t a b l e r e p r e s e n -

    t a t i o n

    2 . K n o w w h a t a l g o r i t h m s t h e y w a n t , w i t h o u t k n o w -

    i n g h o w p a r t i c u l a r o p e r a t i o n s s h o u l d b e i m p l e -

    m e n t e d

    I n b o t h c a s e s , i t i s o f t e n d e s i r a b l e t o d e f e r

    c e r t a i n d e c i s i o n s a s l o n g a s p o s s i b l e

    { G o a l : r e d u c e t h e e o r t r e q u i r e d t o c h a n g e t h e

    i m p l e m e n t a t i o n o n c e e n o u g h i n f o r m a t i o n i s a v a i l -

    a b l e t o m a k e a n i n f o r m e d d e c i s i o n

    2

    M o t i v a t i o n ( c o n t ' d )

    T h e r e f o r e , i t i s u s e f u l t o h a v e s o m e f o r m

    o f a b s t r a c t \ p l a c e - h o l d e r "

    { I n f o r m a t i o n h i d i n g a n d d a t a a b s t r a c t i o n p r o -

    v i d e c o m p i l e - t i m e a n d l i n k - t i m e p l a c e - h o l d e r s

    i . e . , c h a n g e s t o r e p r e s e n t a t i o n s r e q u i r e r e -

    c o m p i l i n g a n d / o r r e l i n k i n g : : :

    { D y n a m i c b i n d i n g p r o v i d e s a d y n a m i c p l a c e - h o l d e r

    i . e . , d e f e r c e r t a i n d e c i s i o n s u n t i l r u n - t i m e

    w i t h o u t d i s r u p t i n g e x i s t i n g c o d e s t r u c t u r e

    N o t e , d y n a m i c b i n d i n g i s o r t h o g o n a l t o d y -

    n a m i c l i n k i n g : : :

    D y n a m i c b i n d i n g i s l e s s p o w e r f u l t h a n p o i n t e r s -

    t o - f u n c t i o n s , b u t m o r e c o m p r e h e n s i b l e a n d

    l e s s e r r o r - p r o n e

    { i . e . , s i n c e t h e c o m p i l e r p e r f o r m s t y p e c h e c k i n g

    a t c o m p i l e - t i m e

    3

    M o t i v a t i o n ( c o n t ' d )

    D y n a m i c b i n d i n g a l l o w s a p p l i c a t i o n s t o b e

    w r i t t e n b y i n v o k i n g g e n e r a l m e t h o d s v i a a

    b a s e c l a s s p o i n t e r , e . g . ,

    c l a s s B a s e f

    p u b l i c

    :v i r t u a l i n t v f ( v o i d ) ;

    g ;

    B a s e * b p = / * p o i n t e r t o a s u b c l a s s * / ;

    b p - > v f ( ) ;

    H o w e v e r , a t r u n - t i m e t h i s i n v o c a t i o n a c -

    t u a l l y i n v o k e s m o r e s p e c i a l i z e d m e t h o d s

    i m p l e m e n t e d i n a d e r i v e d c l a s s , e . g . ,

    c l a s s D e r i v e d : p u b l i c B a s e f

    p u b l i c

    :

    v i r t u a l i n t v f ( v o i d ) ;

    g ;

    D e r i v e d d ;

    b p = & d ;

    b p - > v f ( ) ; / / i n v o k e s D e r i v e d : : v f ( )

    I n C + + , t h i s r e q u i r e s t h a t b o t h t h e g e n -

    e r a l a n d s p e c i a l i z e d m e t h o d s a r e v i r t u a l

    f u n c t i o n s

    4

  • 8/10/2019 C++ dynamic binding

    2/14

    M o t i v a t i o n ( c o n t ' d )

    D y n a m i c b i n d i n g f a c i l i t a t e s m o r e e x i b l e

    a n d e x t e n s i b l e s o f t w a r e a r c h i t e c t u r e s , e . g . ,

    { N o t a l l d e s i g n d e c i s i o n s n e e d t o b e k n o w n d u r -

    i n g t h e i n i t i a l s t a g e s o f s y s t e m d e v e l o p m e n t

    i . e . , t h e y m a y b e p o s t p o n e d u n t i l r u n - t i m e

    { C o m p l e t e s o u r c e c o d e i s n o t r e q u i r e d t o e x t e n d

    t h e s y s t e m

    i . e . , o n l y h e a d e r s a n d o b j e c t c o d e

    T h i s a i d s b o t h e x i b i l i t y a n d e x t e n s i b i l i t y

    { F l e x i b i l i t y = \ e a s i l y r e c o m b i n e e x i s t i n g c o m p o -

    n e n t s i n t o n e w c o n g u r a t i o n s "

    { E x t e n s i b i l i t y = \ e a s i l y a d d n e w c o m p o n e n t s "

    5

    D y n a m i c v s . S t a t i c B i n d i n g

    I n h e r i t a n c e r e v i e w

    { A p o i n t e r t o a d e r i v e d c l a s s c a n a l w a y s b e u s e d

    a s a p o i n t e r t o a b a s e c l a s s t h a t w a s i n h e r i t e d

    p u b l i c l y

    C a v e a t s :

    1 . T h e i n v e r s e i s n o t n e c e s s a r i l y v a l i d o r s a f e

    2 . P r i v a t e b a s e c l a s s e s h a v e d i e r e n t s e m a n t i c s : :

    { e . g .

    ,

    t e m p l a t e

    c l a s s C h e c k e d V e c t o r : p u b l i c V e c t o r

    f: : :

    g ;

    C h e c k e d V e c t o r c v ( 2 0 ) ;

    V e c t o r * v p = & c v ;

    i n t e l e m =( * v p )

    0] ; / / c a l l s o p e r a t o r ]

    (i n t

    )

    { A q u e s t i o n a r i s e s h e r e a s t o w h i c h v e r s i o n o f

    o p e r a t o r ] i s c a l l e d ?

    6

    D y n a m i c v s . S t a t i c B i n d i n g

    ( c o n t ' d )

    T h e a n s w e r d e p e n d s o n t h e t y p e o f b i n d -

    i n g u s e d : : :

    1 . S t a t i c B i n d i n g : t h e c o m p i l e r u s e s t h e t y p e o f

    t h e p o i n t e r t o p e r f o r m t h e b i n d i n g a t c o m p i l e

    t i m e . T h e r e f o r e , V e c t o r : : o p e r a t o r ]

    w i l l

    b e c a l l e d

    V e c t o r : : o p e r a t o r ] ( v p , 0 ) ;

    2 . D y n a m i c B i n d i n g : t h e d e c i s i o n i s m a d e a t r u n -

    t i m e b a s e d u p o n t h e t y p e o f t h e a c t u a l o b j e c t .

    C h e c k e d V e c t o r : : o p e r a t o r ] w i l l b e c a l l e d

    i n t h i s c a s e

    ( * v p - > v p t r

    1] ) ( v p , 0 ) ;

    Q u i c k q u i z : h o w m u s t c l a s s V e c t o r b e

    c h a n g e d t o s w i t c h f r o m s t a t i c t o d y n a m i c

    b i n d i n g ?

    7

    D y n a m i c v s . S t a t i c B i n d i n g

    ( c o n t ' d )

    W h e n t o c h o s e u s e d i e r e n t b i n d i n g s

    { S t a t i c B i n d i n g

    U s e w h e n y o u a r e s u r e t h a t a n y s u b s e q u e n t

    d e r i v e d c l a s s e s w i l l n o t w a n t t o o v e r r i d e t h i s

    o p e r a t i o n d y n a m i c a l l y ( j u s t r e d e n e / h i d e )

    U s e m o s t l y f o r r e u s e o r t o f o r m \ c o n c r e t e

    d a t a t y p e s "

    { D y n a m i c B i n d i n g

    U s e w h e n t h e d e r i v e d c l a s s e s m a y b e a b l e

    t o p r o v i d e a d i e r e n t ( e . g . , m o r e f u n c t i o n a l ,

    m o r e e c i e n t ) i m p l e m e n t a t i o n t h a t s h o u l d

    b e s e l e c t e d a t r u n - t i m e

    U s e d t o b u i l d d y n a m i c t y p e h i e r a r c h i e s a n d

    t o f o r m \ a b s t r a c t d a t a t y p e s "

    8

  • 8/10/2019 C++ dynamic binding

    3/14

    D y n a m i c v s . S t a t i c B i n d i n g

    ( c o n t ' d )

    E c i e n c y v s . e x i b i l i t y a r e t h e p r i m a r y

    t r a d e o s b e t w e e n s t a t i c a n d d y n a m i c b i n d -

    i n g

    S t a t i c b i n d i n g i s g e n e r a l l y m o r e e c i e n t

    s i n c e

    1 . I t h a s l e s s t i m e a n d s p a c e o v e r h e a d

    2 . I t a l s o e n a b l e s f u n c t i o n i n l i n i n g

    D y n a m i c b i n d i n g i s m o r e e x i b l e s i n c e i t

    e n a b l e s d e v e l o p e r s t o e x t e n d t h e b e h a v i o r

    o f a s y s t e m t r a n s p a r e n t l y

    { H o w e v e r , d y n a m i c a l l y b o u n d o b j e c t s a r e d i -

    c u l t t o s t o r e i n s h a r e d m e m o r y

    9

    D y n a m i c B i n d i n g i n C + +

    I n C + + , d y n a m i c b i n d i n g i s s i g n a l e d b y

    e x p l i c i t l y a d d i n g t h e k e y w o r d v i r t u a l i n a

    m e t h o d d e c l a r a t i o n , e . g . ,

    s t r u c t B a s e f

    v i r t u a l i n t v f 1 ( v o i d ) f c o u t

    < v f 1 ( ) ; / / v i r t u a l f u n c t i o n

    g

    B a s e b ;

    B a s e * b p =

    & b ;

    b p - > v f 1 ( ) ; / / p r i n t s " h e l l o "

    D e r i v e d 1 d ;

    b p = & d ;

    b p - > v f 1 ( ) ; / / p r i n t s " w o r l d "

    f o o ( & b ) ; / / p r i n t s " h e l l o "

    f o o ( & d ) ; / / p r i n t s " w o r l d "

    1 2

  • 8/10/2019 C++ dynamic binding

    4/14

    D y n a m i c B i n d i n g i n C + +

    ( c o n t ' d )

    V i r t u a l f u n c t i o n s ( c o n t ' d ) :

    { V i r t u a l m e t h o d s a r e d y n a m i c a l l y b o u n d a n d

    d i s p a t c h e d a t r u n - t i m e , u s i n g a n i n d e x i n t o a n

    a r r a y o f p o i n t e r s t o c l a s s m e t h o d s

    N o t e , t h i s r e q u i r e s o n l y c o n s t a n t o v e r h e a d ,

    r e g a r d l e s s o f t h e i n h e r i t a n c e h i e r a r c h y d e p t h : : :

    T h e v i r t u a l m e c h a n i s m i s s e t u p b y t h e c o n -

    s t r u c t o r ( s ) , w h i c h m a y s t a c k s e v e r a l l e v e l s

    d e e p : : :

    { e . g .

    ,

    v o i d f o o ( B a s e * b p ) f

    b p - > v f 1 ( ) ;

    / / A c t u a l c a l l

    / / ( * b p - > v p t r 1

    ] ) ( b p ) ;

    g

    { U s i n g v i r t u a l f u n c t i o n s a d d s a s m a l l a m o u n t o f

    t i m e a n d s p a c e o v e r h e a d t o t h e c l a s s / o b j e c t

    s i z e a n d m e t h o d i n v o c a t i o n t i m e

    1 3

    S h a p e E x a m p l e

    T h e c a n o n i c a l d y n a m i c b i n d i n g e x a m p l e :

    { D e s c r i b i n g a h i e r a r c h y o f s h a p e s i n a g r a p h i c a l

    u s e r i n t e r f a c e l i b r a r y

    { e . g . , T r i a n g l e , S q u a r e , C i r c l e , R e c t a n g l e , E l -

    l i p s e , e t c .

    A c o n v e n t i o n a l C o r A d a s o l u t i o n w o u l d

    1 . U s e a u n i o n o r v a r i a n t r e c o r d t o r e p r e s e n t a

    S h a p e t y p e

    2 . H a v e a t y p e t a g i n e v e r y S h a p e

    o b j e c t

    3 . P l a c e s p e c i a l c a s e c h e c k s i n f u n c t i o n s t h a t o p -

    e r a t e o n S h a p e s

    { e . g . , f u n c t i o n s t h a t i m p l e m e n t o p e r a t i o n s l i k e

    r o t a t i o n a n d d r a w i n g

    1 4

    S h a p e E x a m p l e ( c o n t ' d )

    C o r A d a s o l u t i o n ( c o n t ' d )

    { e . g .

    ,

    t y p e d e f s t r u c t S h a p e S h a p e ;

    s t r u c t

    S h a p e f

    e n u m

    f

    C I R C L E , S Q U A R E ,

    T R I A N G L E , R E C T A N G L E

    / * E x t e n s i o n s g o h e r e : : : . * /

    gt y p e ;

    u n i o n

    f

    s t r u c t C i r c l e f

    / * : : : . * /g

    c ;

    s t r u c t S q u a r e f

    / * : : : . * /g

    s ;

    s t r u c t T r i a n g l e f

    / * : : : . * /g

    t ;

    s t r u c t R e c t a n g l e f

    / * : : : . * /g

    r ;

    gu ;

    g ;

    v o i d r o t a t e s h a p e ( S h a p e * s p , d o u b l e d e g r e e s ) f

    s w i t c h ( s p - > t y p e ) f

    c a s e

    C I R C L E : r e t u r n ;

    c a s e S Q U A R E : / / D o n ' t f o r g e t t o b r e a k !

    / / : : :

    g

    g

    1 5

    S h a p e E x a m p l e ( c o n t ' d )

    P r o b l e m s w i t h t h e c o n v e n t i o n a l a p p r o a c h :

    { I t i s d i c u l t t o e x t e n d c o d e d e s i g n e d t h i s w a y :

    e . g . , c h a n g e s a r e a s s o c i a t e d w i t h f u n c t i o n s

    a n d a l g o r i t h m s

    W h i c h a r e o f t e n \ u n s t a b l e " e l e m e n t s i n a

    s o f t w a r e s y s t e m d e s i g n a n d i m p l e m e n t a -

    t i o n

    T h e r e f o r e , m o d i c a t i o n s w i l l o c c u r i n p o r -

    t i o n s o f t h e c o d e t h a t s w i t c h o n t h e t y p e

    t a g

    U s i n g a s w i t c h s t a t e m e n t c a u s e s p r o b l e m s ,

    e . g .

    ,

    S e t t i n g a n d c h e c k i n g t y p e t a g s

    F a l l i n g t h r o u g h t o t h e n e x t c a s e , e t c : : :

    N o t e , E i e l d i s a l l o w s s w i t c h s t a t e m e n t s t o

    p r e v e n t t h e s e p r o b l e m s !

    1 6

  • 8/10/2019 C++ dynamic binding

    5/14

    S h a p e E x a m p l e ( c o n t ' d )

    P r o b l e m s w i t h t h e c o n v e n t i o n a l a p p r o a c h

    ( c o n t ' d ) :

    { D a t a s t r u c t u r e s a r e \ p a s s i v e "

    i . e . , f u n c t i o n s d o m o s t o f p r o c e s s i n g w o r k

    o n d i e r e n t k i n d s o f S h a p e s b y e x p l i c i t l y a c -

    c e s s i n g t h e a p p r o p r i a t e e l d s i n t h e o b j e c t

    T h i s l a c k o f i n f o r m a t i o n h i d i n g a e c t s m a i n -

    t a i n a b i l i t y

    { S o l u t i o n w a s t e s s p a c e b y m a k i n g w o r s t - c a s e

    a s s u m p t i o n s w r t s t r u c t s a n d u n i o n s

    { M u s t h a v e s o u r c e c o d e t o e x t e n d t h e s y s t e m

    i n a p o r t a b l e , m a i n t a i n a b l e m a n n e r

    1 7

    S h a p e E x a m p l e ( c o n t ' d )

    A n o b j e c t - o r i e n t e d s o l u t i o n u s e s i n h e r i t a n c e

    a n d d y n a m i c b i n d i n g t o d e r i v e s p e c i c s h a p e s

    (e . g .

    , C i r c l e , S q u a r e , R e c t a n g l e , a n d T r i a n g l e

    f r o m a g e n e r a l A b s t r a c t B a s e C l a s s ( A B C )

    c a l l e d S h a p e

    T h i s a p p r o a c h f a c i l i t i e s a n u m b e r o f s o f t -

    w a r e q u a l i t y f a c t o r s :

    1 . R e u s e

    2 . T r a n s p a r e n t e x t e n s i b i l i t y

    3 . D e l a y i n g d e c i s i o n s u n t i l r u n - t i m e

    4 . A r c h i t e c t u r a l s i m p l i c i t y

    1 8

    S h a p e E x a m p l e ( c o n t ' d )

    N o t e , t h e \ O O D c h a l l e n g e " i s t o m a p a r -

    b i t r a r i l y c o m p l e x s y s t e m a r c h i t e c t u r e s i n t o

    i n h e r i t a n c e h i e r a r c h i e s

    1 9

    S h a p e E x a m p l e ( c o n t ' d )

    / * A b s t r a c t B a s e C l a s s a n d D e r i v e d C l a s s e s

    f o r S h a p e * /

    c l a s s

    S h a p e f

    p u b l i c

    :

    S h a p e ( d o u b l e x , d o u b l e y , C o l o r & c )

    : c e n t e r ( P o i n t ( x , y ) ) , c o l o r ( c ) f g

    S h a p e ( P o i n t & p , C o l o r & c )

    : c e n t e r ( p ) , c o l o r ( c ) f g

    v i r t u a l i n t r o t a t e ( d o u b l e d e g r e e s ) = 0 ;

    v i r t u a l i n t d r a w ( S c r e e n & ) = 0 ;

    v i r t u a l ~ S h a p e ( v o i d )

    = 0 ;

    v o i d c h a n g e c o l o r ( C o l o r & c ) f

    t h i s

    -> c o l o r = c

    P o i n t w h e r e ( v o i d ) c o n s t f r e t u r n t h i s - >

    c e n t e r

    v o i d m o v e ( P o i n t & t o ) f

    t h i s

    ->

    c e n t e r = t o ;

    g

    p r i v a t e

    :

    P o i n t c e n t e r ;

    C o l o r c o l o r ;

    g ;

    2 0

  • 8/10/2019 C++ dynamic binding

    6/14

    S h a p e E x a m p l e ( c o n t ' d )

    N o t e , c e r t a i n m e t h o d s o n l y m a k e s e n s e o n

    s u b c l a s s e s o f c l a s s S h a p e

    { e . g .

    , S h a p e : : r o t a t e a n d

    S h a p e : : d r a w

    T h e r e f o r e , c l a s s S h a p e

    i s d e n e d a s a n A b -

    s t r a c t B a s e C l a s s

    { E s s e n t i a l l y d e n e s o n l y t h e c l a s s i n t e r f a c e

    { D e r i v e d ( i . e . ,

    c o n c r e t e ) c l a s s e s m a y p r o v i d e

    m u l t i p l e , d i e r e n t i m p l e m e n t a t i o n s

    2 1

    S h a p e E x a m p l e ( c o n t ' d )

    A b s t r a c t B a s e C l a s s e s ( A B C s )

    1 . A B C s s u p p o r t t h e n o t i o n o f a g e n e r a l c o n c e p t

    (e . g .

    , S h a p e ) o f w h i c h o n l y m o r e c o n c r e t e o b -

    j e c t v a r i a n t s ( e . g . , C i r c l e

    a n dS q u a r e

    ) a r e

    a c t u a l l y u s e d

    2 . A B C s a r e o n l y u s e d a s a b a s e c l a s s f o r s u b s e -

    q u e n t d e r i v a t i o n s

    { T h e r e f o r e , i t i s i l l e g a l t o c r e a t e o b j e c t s o f

    A B C s

    H o w e v e r , i t i s l e g a l t o d e c l a r e p o i n t e r s o r

    r e f e r e n c e s t o s u c h o b j e c t s : : :

    { A B C s f o r c e d e n i t i o n s i n s u b s e q u e n t d e r i v e d

    c l a s s e s f o r u n d e n e d m e t h o d s

    I n C + + , a n A B C i s c r e a t e d b y d e n i n g a

    c l a s s w i t h a t l e a s t o n e \ p u r e v i r t u a l f u n c -

    t i o n "

    { C o m p a r e w i t h d e f e r r e d c l a s s e s i n E i e l : : :

    2 2

    S h a p e E x a m p l e ( c o n t ' d )

    P u r e v i r t u a l f u n c t i o n s

    { P u r e v i r t u a l f u n c t i o n s m u s t b e m e t h o d s

    { T h e y a r e d e n e d i n t h e b a s e c l a s s o f t h e i n h e r -

    i t a n c e h i e r a r c h y , a n d a r e o f t e n n e v e r i n t e n d e d

    t o b e i n v o k e d d i r e c t l y

    i . e . , t h e y a r e s i m p l y t h e r e t o t i e t h e i n h e r i -

    t a n c e h i e r a r c h y t o g e t h e r b y r e s e r v i n g a s l o t

    i n t h e v i r t u a l t a b l e : : :

    { T h e r e f o r e , C + + a l l o w s u s e r s t o s p e c i f y \ p u r e

    v i r t u a l f u n c t i o n s "

    U s i n g t h e p u r e v i r t u a l s p e c i e r = 0 i n d i c a t e s

    m e t h o d s t h a t a r e n o t m e a n t t o b e d e n e d

    i n t h a t c l a s s

    N o t e , p u r e v i r t u a l f u n c t i o n s a r e a u t o m a t i -

    c a l l y i n h e r i t e d : : :

    2 3

    S h a p e E x a m p l e ( c o n t ' d )

    S i d e n o t e r e g a r d i n g p u r e v i r t u a l d e s t r u c -

    t o r s

    { T h e o n l y e e c t o f d e c l a r i n g a p u r e v i r t u a l d e -

    s t r u c t o r i s t o c a u s e t h e c l a s s b e i n g d e n e d t o

    b e a n A B C

    { D e s t r u c t o r s a r e n o t i n h e r i t e d , t h e r e f o r e :

    A p u r e v i r t u a l d e s t r u c t o r i n a b a s e c l a s s w i l l

    n o t f o r c e d e r i v e d c l a s s e s t o b e A B C s

    N o r w i l l a n y d e r i v e d c l a s s b e f o r c e d t o d e -

    c l a r e a d e s t r u c t o r

    { F u r t h e r m o r e , y o u w i l l h a v e t o p r o v i d e a d e n i -

    t i o n ( i . e . , w r i t e t h e c o d e f o r a m e t h o d ) f o r t h e

    p u r e v i r t u a l d e s t r u c t o r i n t h e b a s e c l a s s

    O t h e r w i s e y o u w i l l g e t r u n - t i m e e r r o r s !

    2 4

  • 8/10/2019 C++ dynamic binding

    7/14

    S h a p e E x a m p l e ( c o n t ' d )

    T h e C + + s o l u t i o n t o t h e S h a p e s e x a m p l e

    u s e s i n h e r i t a n c e a n d d y n a m i c b i n d i n g

    { I n C + + , t h e s p e c i a l c a s e c o d e i s a s s o c i a t e d

    w i t h t h e d e r i v e d c l a s s d a t a s t r u c t u r e s

    { e . g .

    ,

    c l a s s C i r c l e : p u b l i c S h a p e f

    p u b l i c

    :

    C i r c l e ( P o i n t & p , d o u b l e r a d ) ;

    v i r t u a l v o i d d r a w ( S c r e e n & ) ;

    v i r t u a l v o i d

    r o t a t e ( d o u b l e

    d e g r e e s ) f g

    / / : : :

    p r i v a t e

    :

    d o u b l e r a d i u s ;

    g ;

    c l a s s R e c t a n g l e : p u b l i c S h a p e f

    p u b l i c

    :

    R e c t a n g l e ( P o i n t & p , d o u b l e l , d o u b l e w ) ;

    v i r t u a l v o i d r o t a t e ( d o u b l e d e g r e e s ) ;

    v i r t u a l v o i d d r a w ( S c r e e n & ) ;

    / / : : :

    p r i v a t e

    :

    d o u b l e l e n g t h , w i d t h ;

    g ;

    2 5

    S h a p e E x a m p l e ( c o n t ' d )

    C + + s o l u t i o n ( c o n t ' d )

    { U s i n g t h e s p e c i a l r e l a t i o n s h i p b e t w e e n b a s e c l a s s e s

    a n d d e r i v e d s u b c l a s s e s , a n y S h a p e * c a n n o w

    b e \ r o t a t e d " w i t h o u t w o r r y i n g a b o u t w h a t k i n d

    o fS h a p e

    i t p o i n t s t o

    { T h e s y n t a x f o r d o i n g t h i s i s :

    v o i d r o t a t e s h a p e ( S h a p e * s p , d o u b l e d e g r e e s ) f

    s p - > r o t a t e ( d e g r e e s ) ;

    / / ( * s p - > v p t r 1

    ] ) ( s p , d e g r e e s ) ;

    g

    { N o t e , w e a r e s t i l l \ i n t e r f a c e c o m p a t i b l e " w i t h

    o r i g i n a l C v e r s i o n !

    2 6

    S h a p e E x a m p l e ( c o n t ' d )

    C i r c l e R e c t a n g l e

    0 R o t a t e 0 R o t a t e D r a w D r a w

    v p t r v p t r

    v t a b l e ( C i r c l e ) v t a b l e ( R e c t a n g l e )

    T h i s c o d e w i l l c o n t i n u e t o w o r k r e g a r d -

    l e s s o f w h a t d e r i v e d c l a s s o f S h a p e

    t h a t s p

    a c t u a l l y p o i n t s t o , e . g . ,

    C i r c l e c ;

    R e c t a n g l e r ;

    r o t a t e s h a p e ( & c , 1 0 0 . 0 ) ;

    r o t a t e s h a p e ( & r , 2 5 0 . 0 ) ;

    2 7

    S h a p e E x a m p l e ( c o n t ' d )

    C h a r a c t e r i s t i c s o f t h e C + + d y n a m i c b i n d -

    i n g s o l u t i o n :

    { A s s o c i a t e a l l s p e c i a l i z a t i o n s w i t h t h e d e r i v e d

    c l a s s

    R a t h e r t h a n w i t h f u n c t i o n r o t a t e s h a p e

    { T h i s m a k e s i t p o s s i b l e t o a d d n e w t y p e s ( d e -

    r i v e d f r o m b a s e c l a s s S h a p e

    ) w i t h o u t b r e a k i n g

    e x i s t i n g c o d e

    i . e . , m o s t e x t e n s i o n s / c h a n g e s o c c u r i n o n l y

    o n e p l a c e

    { e . g . , a d d a n e w c l a s s S q u a r e d e r i v e d f r o m c l a s s

    R e c t a n g l e :

    c l a s s S q u a r e : p u b l i c R e c t a n g l e f

    / / I n h e r i t s l e n g t h a n d w i d t h f r o m R e c t a n g l e

    p u b l i c

    :

    S q u a r e ( P o i n t & p , d o u b l e b a s e ) ;

    v i r t u a l v o i d d r a w ( S c r e e n & ) ;

    v i r t u a l v o i d r o t a t e ( d o u b l e d e g r e e ) f

    i f ( d e g r e e % 9 0 . 0 ! = 0 )

    / / R e u s e e x i s t i n g c o d e

    R e c t a n g l e : : r o t a t e ( d e g r e e ) ;

    g

    / * : : : . * /

    g ;

    2 8

  • 8/10/2019 C++ dynamic binding

    8/14

    S h a p e E x a m p l e ( c o n t ' d )

    C + + s o l u t i o n w i t h d y n a m i c b i n d i n g ( c o n t ' d )

    { W e c a n s t i l l r o t a t e a n y S h a p e

    o b j e c t b y u s i n g

    t h e o r i g i n a l f u n c t i o n , i . e . ,

    v o i d r o t a t e s h a p e ( S h a p e * s p , d o u b l e d e g r e e s )

    f

    s p - > r o t a t e ( d e g r e e s ) ;

    g

    S q u a r e s ;

    C i r c l e c ;

    R e c t a n g l e r ;

    r o t a t e s h a p e ( & s , 1 0 0 . 0 ) ;

    r o t a t e s h a p e ( & r , 2 5 0 . 0 ) ;

    r o t a t e s h a p e ( & c , 1 7 . 0 ) ;

    2 9

    S h a p e E x a m p l e ( c o n t ' d )

    C o m p a r i s o n b e t w e e n 2 a p p r o a c h e s

    { I f s u p p o r t f o r S q u a r e

    w a s a d d e d i n t h e C o r

    A d a s o l u t i o n , t h e n e v e r y p l a c e w h e r e t h e t y p e

    t a g w a s a c c e s s e d w o u l d h a v e t o b e m o d i e d

    i . e . , m o d i c a t i o n s a r e s p r e a d o u t a l l o v e r t h e

    p l a c e

    I n c l u d i n g b o t h h e a d e r l e s a n d f u n c t i o n s

    N o t e , t h e C o r A d a a p p r o a c h p r e v e n t s e x -

    t e n s i b i l i t y i f t h e p r o v i d e r o f S q u a r e d o e s

    n o t h a v e a c c e s s t o t h e s o u r c e c o d e o f

    f u n c t i o n r o t a t e s h a p e !

    { i . e . , o n l y t h e h e a d e r l e s a n d o b j e c t c o d e i s

    r e q u i r e d t o a l l o w e x t e n s i b i l i t y i n C + +

    3 0

    S h a p e E x a m p l e ( c o n t ' d )

    C o m p a r i s o n b e t w e e n 2 a p p r o a c h e s ( c o n t ' d )

    / * C s o l u t i o n * /

    v o i d r o t a t e s h a p e ( S h a p e * s p , d o u b l e d e g r e e ) f

    s w i t c h

    ( s p - > t y p e )

    f

    c a s e C I R C L E : r e t u r n ;

    c a s e S Q U A R E :

    i f ( d e g r e e % 9 0 = = 0 )

    r e t u r n

    ;

    e l s e

    / * F A L L T H R O U G H * / ;

    c a s e R E C T A N G L E :

    / / : : :

    b r e a k

    ;

    g

    g

    3 1

    S h a p e E x a m p l e ( c o n t ' d )

    E x a m p l e f u n c t i o n t h a t r o t a t e s s i z e

    s h a p e s

    b ya n g l e

    d e g r e e s :

    v o i d r o t a t e a l l ( S h a p e * v e c ],

    i n t s i z e , d o u b l e a n g l e

    f

    f o r

    (i n t

    i= 0 ; i r o t a t e ( a n g l e ) ;

    g

    v e c i ] - > r o t a t e ( a n g l e ) i s a v i r t u a l f u n c -

    t i o n c a l l

    { I t i s r e s o l v e d a t r u n - t i m e a c c o r d i n g t o t h e a c -

    t u a l t y p e o f o b j e c t p o i n t e d t o b y v e c i ]

    { i . e .

    ,

    v e c i

    ]

    -> r o t a t e ( a n g l e ) b e c o m e s

    ( * v e c

    i]

    -> v p t r

    1] ) ( v e c

    i] , a n g l e ) ;

    3 2

  • 8/10/2019 C++ dynamic binding

    9/14

    S h a p e E x a m p l e ( c o n t ' d )

    S a m p l e u s a g e o f f u n c t i o n r o t a t e a l l i s

    S h a p e * s h a p e s ] =f

    n e w C i r c l e ( / * : : : . * / ) ,

    n e w S q u a r e ( / * : : : . * / )

    g ;

    i n t s i z e = s i z e o f s h a p e s / s i z e o f * s h a p e s ;

    r o t a t e a l l ( s h a p e s , s i z e , 9 8 . 6 ) ;

    N o t e , i t i s n o t g e n e r a l l y p o s s i b l e t o k n o w

    t h e e x a c t t y p e o f e l e m e n t s i n v a r i a b l e s h a p e s

    u n t i l r u n - t i m e

    { H o w e v e r , a t c o m p i l e - t i m e w e k n o w t h e y a r e a l l

    d e r i v e d s u b t y p e s o f b a s e c l a s s S h a p e

    T h i s i s w h y C + + i s n o t f u l l y p o l y m o r p h i c ,

    b u t i s s t r o n g l y t y p e d

    3 3

    S h a p e E x a m p l e ( c o n t ' d )

    C i r c l e S q u a r e

    0 R o t a t e 0 R o t a t e D r a w D r a w

    v p t r v p t r

    v t a b l e ( C i r c l e ) v t a b l e ( S q u a r e )

    0 1s h a p e s

    H e r e ' s w h a t t h e m e m o r y l a y o u t l o o k s l i k e

    3 4

    S h a p e E x a m p l e ( c o n t ' d )

    N o t e t h a t b o t h t h e i n h e r i t a n c e / d y n a m i c

    b i n d i n g a n d u n i o n /

    s w i t c h s t a t e m e n t a p -

    p r o a c h e s p r o v i d e m e c h a n i s m s f o r h a n d l i n g

    t h e d e s i g n a n d i m p l e m e n t a t i o n o f v a r i a n t s

    T h e a p p r o p r i a t e c h o i c e o f t e c h n i q u e s o f -

    t e n d e p e n d s o n w h e t h e r t h e c l a s s i n t e r f a c e

    i s s t a b l e o r n o t

    { A d d i n g a n e w s u b c l a s s i s e a s y v i a i n h e r i t a n c e ,

    b u t d i c u l t u s i n g u n i o n /

    s w i t c h ( s i n c e c o d e i s

    s p r e a d o u t e v e r y w h e r e )

    { O n t h e o t h e r h a n d , a d d i n g a n e w f u n c t i o n t o

    a n i n h e r i t a n c e h i e r a r c h y i s d i c u l t , b u t r e l -

    a t i v e l y e a s i e r u s i n g u n i o n /

    s w i t c h ( s i n c e t h e

    c o d e f o r t h e f u n c t i o n i s l o c a l i z e d )

    3 5

    C a l l i n g M e c h a n i s m s

    G i v e n a p o i n t e r t o a c l a s s o b j e c t ( e . g . ,

    c l a s s F o o * p t r ) h o w i s t h e m e t h o d c a l l

    p t r - > f ( a r g ) r e s o l v e d ?

    T h e r e a r e t h r e e b a s i c a p p r o a c h e s :

    1 . S t a t i c B i n d i n g

    2 . V i r t u a l F u n c t i o n T a b l e s

    3 . M e t h o d D i s p a t c h T a b l e s

    C + + a n d J a v a u s e b o t h s t a t i c b i n d i n g a n d

    v i r t u a l f u n c t i o n t a b l e s . S m a l l t a l k a n d O b -

    j e c t i v e C u s e m e t h o d d i s p a t c h t a b l e s

    N o t e , t y p e c h e c k i n g i s o r t h o g o n a l t o b i n d -

    i n g t i m e : : :

    3 6

  • 8/10/2019 C++ dynamic binding

    10/14

    C a l l i n g M e c h a n i s m s ( c o n t ' d )

    S t a t i c B i n d i n g

    { M e t h o d f

    ' s a d d r e s s i s d e t e r m i n e d a t c o m p i l e / l i n k

    t i m e

    { P r o v i d e s f o r s t r o n g t y p e c h e c k i n g , c o m p l e t e l y

    c h e c k a b l e / r e s o l v a b l e a t c o m p i l e t i m e

    { M a i n a d v a n t a g e : t h e m o s t e c i e n t s c h e m e

    e . g . , i t p e r m i t s i n l i n e f u n c t i o n e x p a n s i o n

    { M a i n d i s a d v a n t a g e : t h e l e a s t e x i b l e s c h e m e

    3 7

    C a l l i n g M e c h a n i s m s ( c o n t ' d )

    V i r t u a l F u n c t i o n T a b l e s

    { M e t h o d f

    i s c o n v e r t e d i n t o a n i n d e x i n t o a

    t a b l e o f p o i n t e r s t o f u n c t i o n s ( i . e . , t h e v i r t u a l

    f u n c t i o n t a b l e ) t h a t p e r m i t r u n - t i m e r e s o l u t i o n

    o f t h e c a l l i n g a d d r e s s

    T h e

    * p t r o b j e c t k e e p s t r a c k o f i t s t y p e v i a a

    h i d d e n p o i n t e r ( v p t r

    ) t o i t s a s s o c i a t e d v i r -

    t u a l f u n c t i o n t a b l e ( v t a b l e )

    { V i r t u a l f u n c t i o n s p r o v i d e a n e x a c t s p e c i c a t i o n

    o f t h e t y p e s i g n a t u r e

    T h e u s e r i s g u a r a n t e e d t h a t o n l y o p e r a t i o n s

    s p e c i e d i n c l a s s d e c l a r a t i o n s w i l l b e a c c e p t e d

    b y t h e c o m p i l e r

    3 8

    C a l l i n g M e c h a n i s m s ( c o n t ' d )

    V i r t u a l F u n c t i o n T a b l e s ( c o n t ' d )

    { M a i n a d v a n t a g e s

    1 . M o r e e x i b l e t h a n s t a t i c b i n d i n g

    2 . T h e r e o n l y a c o n s t a n t a m o u n t o f o v e r h e a d

    ( c o m p a r e d w i t h m e t h o d d i s p a t c h i n g )

    e . g . , i n C + + , p o i n t e r s t o f u n c t i o n s a r e

    s t o r e d i n a s e p a r a t e t a b l e , n o t i n t h e o b -

    j e c t !

    { M a i n d i s a d v a n t a g e s

    L e s s e c i e n t

    e . g . , o f t e n n o t p o s s i b l e t o i n l i n e t h e v i r t u a l

    f u n c t i o n c a l l s : : :

    3 9

    C a l l i n g M e c h a n i s m s ( c o n t ' d )

    o b j 2

    o b j 1

    o b j 3

    0 1 2

    v p t r

    v p t r

    v p t r

    v t a b l e

    f 2

    f 1

    e . g . ,

    c l a s s F o of

    p u b l i c

    :

    v i r t u a l i n t f 1 ( v o i d ) ;

    v i r t u a l i n t f 2 ( v o i d ) ;

    i n t f 3 ( v o i d ) ;

    p r i v a t e

    :

    / / d a t a : : :

    g ;

    F o o o b j 1 , o b j 2 , o b j 3 ;

    4 0

  • 8/10/2019 C++ dynamic binding

    11/14

    C a l l i n g M e c h a n i s m s ( c o n t ' d )

    M e t h o d D i s p a t c h T a b l e s

    { M e t h o d f

    i s l o o k e d u p i n a t a b l e t h a t i s c r e a t e d

    a n d m a n a g e d d y n a m i c a l l y a t r u n - t i m e

    i . e . , a d d / d e l e t e / c h a n g e m e t h o d s d y n a m i c a l l y

    {

    M a i n a d v a n t a g e : t h e m o s t e x i b l e s c h e m e

    i . e . , n e w m e t h o d s c a n b e a d d e d o r d e l e t e d

    o n - t h e - y

    a n d a l l o w s u s e r s t o i n v o k e a n y m e t h o d f o r

    a n y o b j e c t

    { M a i n d i s a d v a n t a g e : g e n e r a l l y i n e c i e n t a n d

    n o t a l w a y s t y p e - s e c u r e

    M a y r e q u i r e s e a r c h i n g m u l t i p l e t a b l e s a t r u n -

    t i m e

    S o m e f o r m o f c a c h i n g i s o f t e n u s e d

    P e r f o r m i n g r u n - t i m e t y p e c h e c k i n g a l o n g w i t h

    r u n - t i m e m e t h o d i n v o c a t i o n f u r t h e r d e c r e a s e s

    r u n - t i m e e c i e n c y

    T y p e e r r o r s m a y n o t m a n i f e s t t h e m s e l v e s u n -

    t i l r u n - t i m e

    4 1

    D o w n c a s t i n g

    D o w n c a s t i n g i s d e n e d a s :

    { E i t h e r m a n u a l l y o r a u t o m a t i c a l l y c a s t i n g a p o i n t e r

    o r r e f e r e n c e o f a b a s e c l a s s t y p e t o a t y p e o f

    a p o i n t e r o r r e f e r e n c e t o a d e r i v e d c l a s s .

    { i . e . , g o i n g t h e o p p o s i t e d i r e c t i o n f r o m u s u a l

    \ b a s e - c l a s s / d e r i v e d - c l a s s " i n h e r i t a n c e r e l a t i o n s h i p

    D o w n c a s t i n g i s u s e f u l f o r

    1 . C l o n i n g a n o b j e c t

    { e . g . , r e q u i r e d f o r \ d e e p c o p i e s "

    2 . R e s t o r i n g a n o b j e c t f r o m d i s k

    { T h i s i s h a r d t o d o t r a n s p a r e n t l y : : :

    3 . T a k i n g a n o b j e c t o u t o f a h e t e r o g e n e o u s c o l -

    l e c t i o n o f o b j e c t s a n d r e s t o r i n g i t s o r i g i n a l t y p e

    { A l s o h a r d t o d o , u n l e s s t h e o n l y a c c e s s i s v i a

    t h e i n t e r f a c e o f t h e b a s e c l a s s

    4 2

    D o w n c a s t i n g ( c o n t ' d )

    C o n t r a v a r i a n c e

    { D o w n c a s t i n g c a n l e a d t o t r o u b l e d u e t o c o n -

    t r a v a r i a n c e

    I t i s c o n s e q u e n c e o f i n h e r i t a n c e t h a t w o r k s

    a g a i n s t p r o g r a m m e r s i n a s y m m e t r i c a l l y o p -

    p o s i n g f a s h i o n t o t h e w a y i n h e r i t a n c e w o r k s

    f o r t h e m

    { C o n s i d e r t h e f o l l o w i n g d e r i v a t i o n h i e r a r c h y :

    s t r u c t B a s e f

    i n t i ;

    v i r t u a l i n t f o o ( v o i d ) f

    r e t u r n t h i s

    -> i ;

    g

    g ;

    s t r u c t D e r i v e d : p u b l i c B a s e f

    i n t j ;

    v i r t u a l i n t f o o ( v o i d ) f

    r e t u r n t h i s

    -> j ;

    g

    g ;

    v o i d f o o ( v o i d ) f

    B a s e b ;

    D e r i v e d d ;

    B a s e * b p = & d ; / / O K , a D e r i v e d i s a B a s e

    D e r i v e d * d p = & b ; / / E r r o r , a B a s e i s n o t

    / / n e c e s s a r i l y a D e r i v e d

    g

    4 3

    D o w n c a s t i n g ( c o n t ' d )

    i i

    j

    b pd p

    b d

    ?

    P r o b l e m : w h a t h a p p e n s i f d p - >

    j i s r e f e r -

    e n c e d o r s e t ?

    4 4

  • 8/10/2019 C++ dynamic binding

    12/14

    D o w n c a s t i n g ( c o n t ' d )

    C o n t r a v a r i a n c e ( c o n t ' d )

    { S i n c e a D e r i v e d o b j e c t a l w a y s c o n t a i n s a B a s e

    p a r t c e r t a i n o p e r a t i o n s a r e w e l l d e n e d :

    b p = & d ;

    b p - >i

    = 1 0 ;

    b p ->

    f o o ( ) ; / / c a l l s D e r i v e d : : f o o ( ) ;

    { H o w e v e r , s i n c e b a s e o b j e c t s d o n o t c o n t a i n t h e

    d a t a p o r t i o n s o f a n y o f t h e i r d e r i v e d c l a s s e s ,

    o t h e r o p e r a t i o n s a r e n o t d e n e d

    e . g . , t h i s a s s i g n m e n t a c c e s s e s i n f o r m a t i o n

    b e y o n d t h e e n d o f o b j e c t b :

    d p = ( D e r i v e d * ) & b ;

    d p - >j

    = 2 0 ; / / b i g t r o u b l e !

    { N o t e , C + + p e r m i t s c o n t r a v a r i a n c e i f t h e p r o -

    g r a m m e r e x p l i c i t l y p r o v i d e s a d o w n c a s t ,

    e . g .

    ,

    d p = ( D e r i v e d * ) & b ; / / u n c h e c k e d c a s t

    { I t i s t h e p r o g r a m m e r ' s r e s p o n s i b i l i t y t o m a k e

    s u r e t h a t o p e r a t i o n s u p o n d p d o n ' t a c c e s s n o n -

    e x i s t e n t e l d s o r m e t h o d s

    4 5

    D o w n c a s t i n g ( c o n t ' d )

    T r a d i t i o n a l l y , d o w n c a s t i n g w a s n e c e s s a r y

    d u e t o t h e f a c t t h a t C + + o r i g i n a l l y d i d

    n o t s u p p o r t o v e r l o a d i n g o n f u n c t i o n \ r e -

    t u r n " t y p e

    { e . g . , i n C + + t h e f o l l o w i n g i s c u r r e n t l y n o t a l -

    l o w e d i n m o s t c o m p i l e r s :

    s t r u c t B a s e f

    v i r t u a l B a s e * c l o n e ( v o i d ) ;

    g ;

    s t r u c t D e r i v e d : p u b l i c B a s e f

    v i r t u a l D e r i v e d * c l o n e ( v o i d ) ; / / E r r o r !

    g ;

    { H o w e v e r , a s s u m i n g w e m a k e t h e a p p r o p r i a t e

    v i r t u a l B a s e * c l o n e ( v o i d ) c h a n g e i n c l a s s D e r i v e d

    B a s e * o b 1 = n e w D e r i v e d ;

    D e r i v e d * o b 2 = n e w D e r i v e d ;

    { T h e f o l l o w i n g a r e s y n t a x \ e r r o r s " ( t h o u g h t h e y

    a r e a c t u a l l y t y p e - s e c u r e ) :

    D e r i v e d * o b 3 =o b 1 -

    > c l o n e ( ) ; / / e r r o r

    D e r i v e d * o b 4 =o b 2 -

    > c l o n e ( ) ; / / e r r o r

    { T o p e r f o r m t h e i n t e n d e d o p e r a t i o n , w e m u s t

    u s e a c a s t t o \ t r i c k " t h e t y p e s y s t e m , e . g . ,

    D e r i v e d * o b 5 = ( D e r i v e d * ) o b 1 - > c l o n e ( ) ;

    4 6

    D o w n c a s t i n g ( c o n t ' d )

    T h e r i g h t w a y t o h a n d l e t h i s i s t o u s e

    t h e C + + R u n - T i m e T y p e I d e n t i c a t i o n

    ( R T T I ) f e a t u r e

    H o w e v e r , s i n c e m o s t C + + c o m p i l e r s d o

    n o t s u p p o r t t y p e - s a f e d o w n c a s t i n g , s o m e

    w o r k a r o u n d s i n c l u d e :

    1 . D o n ' t d o i t , s i n c e i t i s p o t e n t i a l l y n o n - t y p e - s a f e

    2 . U s e a n e x p l i c i t c a s t ( e . g . , o b 5 ) a n d c r o s s y o u r

    n g e r s

    3 . E n c o d e t y p e t a g a n d w r i t e m a s s i v e s w i t c h s t a t e -

    m e n t s

    { W h i c h d e f e a t s t h e p u r p o s e o f d y n a m i c b i n d -

    i n g

    4 . M a n u a l l y e n c o d e t h e r e t u r n t y p e i n t o t h e m e t h o d

    n a m e :

    D e r i v e d * o b 6 =o b 2 -

    > c l o n e D e r i v e d ( ) ;

    4 7

    R u n - T i m e T y p e I d e n t i c a t i o n

    R T T I i s a t e c h n i q u e t h a t a l l o w s a p p l i c a -

    t i o n s t o u s e t h e C + + r u n - t i m e s y s t e m t o

    q u e r y t h e t y p e o f a n o b j e c t a t r u n - t i m e

    { O n l y s u p p o r t s v e r y s i m p l e q u e r i e s r e g a r d i n g t h e

    i n t e r f a c e s u p p o r t e d b y a t y p e

    R T T I i s o n l y f u l l y s u p p o r t e d f o r d y n a m i c a l l y -

    b o u n d c l a s s e s

    { A l t e r n a t i v e a p p r o a c h e s w o u l d i n c u r u n a c c e p t -

    a b l e r u n - t i m e c o s t s a n d s t o r a g e l a y o u t c o m -

    p a t i b i l i t y p r o b l e m s

    4 8

  • 8/10/2019 C++ dynamic binding

    13/14

    R u n - T i m e T y p e I d e n t i c a t i o n

    ( c o n t ' d )

    R T T I c o u l d b e u s e d i n o u r o r i g i n a l e x a m -

    p l e i n v o l v i n g o b 1

    B a s e * o b 1 = n e w D e r i v e d ;

    i f ( D e r i v e d * o b 2 = d y n a m i c c a s t ( o b 1 - > c l o n e ( ) ) )

    / * u s e o b 2 * / ;

    e l s e

    / * e r r o r ! * /

    F o r a d y n a m i c c a s t t o s u c c e e d , t h e \ a c -

    t u a l t y p e " o f o b 1 w o u l d h a v e t o e i t h e r b e

    a D e r i v e d o b j e c t o r s o m e s u b c l a s s o f D e -

    r i v e d

    { I f t h e t y p e s d o n o t m a t c h t h e o p e r a t i o n f a i l s

    a t r u n - t i m e

    { I f f a i l u r e o c c u r s , t h e r e a r e s e v e r a l w a y s t o d y -

    n a m i c a l l y i n d i c a t e t h i s t o t h e a p p l i c a t i o n :

    T o r e t u r n a N U L L p o i n t e r f o r f a i l u r e

    T o t h r o w a n e x c e p t i o n

    e . g . , i n t h e c a s e o f r e f e r e n c e c a s t s : : :

    4 9

    R u n - T i m e T y p e I d e n t i c a t i o n

    ( c o n t ' d )

    d y n a m i c c a s t u s e d w i t h r e f e r e n c e s

    { A r e f e r e n c e d y n a m i c c a s t t h a t f a i l s t h r o w s a

    b a d c a s t e x c e p t i o n

    e . g . ,

    v o i d c l o n e ( B a s e & o b 1 )

    f

    t r y

    f

    D e r i v e d & o b 2 =

    d y n a m i c c a s t ( o b 1 ) ;

    / * : : : * /

    g

    c a t c h ( b a d c a s t )

    f

    / * : : : * /

    g

    g

    5 0

    R u n - T i m e T y p e I d e n t i c a t i o n

    ( c o n t ' d )

    A l o n g w i t h t h e d y n a m i c c a s t e x t e n s i o n ,

    t h e C + + l a n g u a g e n o w c o n t a i n s a t y p e i d

    o p e r a t o r t h a t a l l o w s q u e r i e s o f a l i m i t e d

    a m o u n t o f t y p e i n f o r m a t i o n a t r u n - t i m e

    { I n c l u d e s b o t h d y n a m i c a l l y - b o u n d a n d n o n - d y n a m i c a l l y -

    b o u n d t y p e s : : :

    e . g . ,

    t y p e i d

    (t y p e n a m e

    ) !c o n s t T y p e i n f o &

    t y p e i d

    (e x p r e s s i o n

    ) !c o n s t T y p e i n f o &

    N o t e t h a t t h e e x p r e s s i o n f o r m r e t u r n s t h e

    r u n - t i m e t y p e o f t h e e x p r e s s i o n i f t h e c l a s s

    i s d y n a m i c a l l y b o u n d : : :

    5 1

    R u n - T i m e T y p e I d e n t i c a t i o n

    ( c o n t ' d )

    H e r e a r e s o m e s h o r t e x a m p l e s

    B a s e * b p = n e w D e r i v e d ;

    B a s e & b r =* b p ;

    t y p e i d

    ( b p ) = = t y p e i d ( B a s e * ) / / t r u e

    t y p e i d

    ( b p ) = = t y p e i d ( D e r i v e d * ) / / f a l s e

    t y p e i d

    ( b p ) = = t y p e i d ( B a s e ) / / f a l s e

    t y p e i d

    ( b p ) = = t y p e i d ( D e r i v e d ) / / f a l s e

    t y p e i d ( * b p ) = = t y p e i d ( D e r i v e d ) / / t r u e

    t y p e i d ( * b p ) = = t y p e i d ( B a s e ) / / f a l s e

    t y p e i d

    ( b r ) = = t y p e i d ( D e r i v e d ) / / t r u e

    t y p e i d

    ( b r ) = = t y p e i d ( B a s e ) / / f a l s e

    t y p e i d ( & b r ) = = t y p e i d ( B a s e * ) / / t r u e

    t y p e i d ( & b r ) = = t y p e i d ( D e r i v e d * ) / / f a l s e

    5 2

  • 8/10/2019 C++ dynamic binding

    14/14

    R u n - T i m e T y p e I d e n t i c a t i o n

    ( c o n t ' d )

    A c o m m o n g r i p e i s R T T I w i l l e n c o u r a g e

    t h e d r e a d e d \ s w i t c h s t a t e m e n t o f d e a t h , "

    e . g . ,

    v o i d f o o ( O b j e c t * o p ) f

    o p - > d o s o m e t h i n g ( ) ;

    i f ( F o o b a r * f b p = d y n a m i c c a s t ( o p ) )

    f b p - > d o f o o b a r t h i n g s ( ) ;

    e l s e i f ( F o o * f p = d y n a m i c c a s t ( o p ) )

    f p - > d o f o o t h i n g s ( ) ;

    e l s e i f ( B a r * b p = d y n a m i c c a s t ( o p ) )

    b p - > d o b a r t h i n g s ( ) ;

    e l s e

    o p - > d o o b j e c t s t u ( ) ;

    g

    I m p l e m e n t i n g t h i s s t y l e o f t y p e t a g g i n g b y

    h a n d ( r a t h e r t h a n b y t h e c o m p i l e r ) l e a d s

    t o a n a l t e r n a t i v e , s l o w e r m e t h o d o f d i s -

    p a t c h i n g m e t h o d s

    { i . e . , d u p l i c a t i n g t h e w o r k o f v t a b l e s i n a n u n s a f e

    m a n n e r t h a t a c o m p i l e r c a n n o t d o u b l e c h e c k

    { H o w e v e r , e v e n a n a u t o m a t e d a p p r o a c h c a n b e

    h a r d t o m a k e e c i e n t !

    5 3

    S u m m a r y

    D y n a m i c b i n d i n g e n a b l e s a p p l i c a t i o n s a n d

    d e v e l o p e r s t o d e f e r c e r t a i n i m p l e m e n t a -

    t i o n d e c i s i o n s u n t i l r u n - t i m e

    { i . e . , w h i c h i m p l e m e n t a t i o n i s u s e d f o r a p a r t i c -

    u l a r i n t e r f a c e

    I t a l s o f a c i l i t a t e s a d e c e n t r a l i z e d a r c h i t e c -

    t u r e t h a t p r o m o t e s e x i b i l i t y a n d e x t e n s i -

    b i l i t y

    { e . g . , i t i s p o s s i b l e t o m o d i f y f u n c t i o n a l i t y w i t h -

    o u t m o d i f y i n g e x i s t i n g c o d e

    T h e r e i s s o m e a d d i t i o n a l r u n - t i m e o v e r -

    h e a d f r o m u s i n g d y n a m i c b i n d i n g : : :

    { H o w e v e r , a l t e r n a t i v e s o l u t i o n s a l s o i n c u r o v e r -

    h e a d

    e . g . , t h e u n i o n

    /s w i t c h

    a p p r o a c h

    5 4