C++ dynamic binding
Transcript of C++ dynamic binding
-
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