object oriented programming (oop) - cs304 power point slides lecture 37

Upload: sameer-hane

Post on 04-Jun-2018

228 views

Category:

Documents


1 download

TRANSCRIPT

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    1/33

    Object-Oriented Programming

    (OOP)

    Lecture No. 37

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    2/33

    Resolution Order

    template< typename T >

    class Vector { };

    template< typename T >

    class Vector< T* > { };

    template< >

    class Vector< char* > { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    3/33

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    4/33

    Example Resolution Order

    int main() {Vector< char* > strVector;

    // Vector< char* > instantiated

    Vector< int* > iPtrVector;

    // Vector< T* > instantiated

    Vector< int > intVector;// Vector< T > instantiated

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    5/33

    Function Template Overloading

    template< typename T >

    void sort( T );

    template< typename T >void sort( Vector< T > & );

    template< >

    void sort< Vector >(Vector< char* > & );

    void sort( char* );

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    6/33

    Resolution Order

    Compiler searches target of a function call

    in the following order

    Ordinary Function

    Complete Specialization

    Partial Specialization

    Generic Template

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    7/33

    ExampleResolution Order

    int main() {

    char* str = Hello World!;

    sort(str); // sort( char* )

    Vector v1 = {ab, cd, };

    sort(v1); //sort( Vector & )

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    8/33

    Example Resolution Order

    Vector v2 = { 5, 10, 15, 20 };

    sort(v2); // sort( Vector &)

    int iArray[] = { 5, 2, 6 , 70 };

    sort(iArray); // sort( T )

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    9/33

    Templates and Inheritance

    We can use inheritance comfortably with

    templates or their specializations

    But we must follow one rule:

    Derived class must take at least as manytemplate parameters as the base class

    requires for an instantiation

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    10/33

    Derivations of a Template

    A class template may inherit from anotherclass template

    template< class T >class A

    { };

    template< class T >

    class B : public A< T >

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    11/33

    Derivations of a Template

    int main() {

    A< int > obj1;

    B< int > obj2;

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    12/33

    Derivations of a Template

    A partial specialization may inherit from a

    class template

    template< class T >

    class B< T* > : public A< T >

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    13/33

    Derivations of a Template

    int main() {

    A< int > obj1;

    B< int* > obj2;

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    14/33

    Derivations of a Template

    Complete specialization or ordinary classcannot inherit from a class template

    template< >class B< char* > : public A< T >

    { };// Error: T undefined

    class B : public A< T >

    { };// Error: T undefined

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    15/33

    Derivations of a Partial Sp.

    A class template may inherit from a partialspecialization

    template< class T >class A

    { };

    template< class T >

    class A< T* >

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    16/33

    Derivations of a Partial Sp.

    template< class T >

    class B : public A< T* >

    { }

    int main() {

    A< int* > obj1;

    B< int > obj2;

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    17/33

    Derivations of a Partial Sp.

    A partial specialization may inherit from a

    partial specialization

    template< class T >

    class B< T* > : public A< T* >

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    18/33

    Derivations of a Partial Sp.

    int main() {

    A< int* > obj1;

    B< int* > obj2;

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    19/33

    Derivations of a Partial Sp.

    Complete specialization or ordinary classcannot inherit from a partial specialization

    template< >class B< int* > : public A< T* >

    { } // Error: Undefined T

    class B : public A< T* >

    { } // Error: Undefined T

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    20/33

    Derivations of a Complete Sp.

    A class template may inherit from a

    complete specialization

    template< class T > class A

    { };

    template< >

    class A< float* >

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    21/33

    Derivations of a Complete Sp.

    template< class T >

    class B : public A< float* >

    { };

    int main() {

    A< float* > obj1;

    B< int > obj2;return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    22/33

    Derivations of a Complete Sp.

    A partial specialization may inherit from a

    complete specialization

    template< class T >

    class B< T* > : public A< float* >

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    23/33

    Derivations of a Complete Sp.

    int main() {

    A< float* > obj1;

    B< int* > obj2;

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    24/33

    Derivations of a Complete Sp.

    A complete specialization may inherit from

    a complete specialization

    template< >

    class B< double* > :

    public A< float* >

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    25/33

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    26/33

    Derivations of a Complete Sp.

    An ordinary class may inherit from a

    complete specialization

    class B : public A< float* >

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    27/33

    Derivations of a Complete Sp.

    int main() {

    A< float* > obj1;

    B obj2;

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    28/33

    Derivations of Ordinary Class

    A class template may inherit from an

    ordinary class

    class A

    { };

    template< class T >

    class B : public A

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    29/33

    Derivations of Ordinary Class

    int main() {

    A obj1;

    B< int > obj2;

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    30/33

    Derivations of Ordinary Class

    A partial specialization may inherit from an

    ordinary class

    template< class T >

    class B< T* > : public A

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    31/33

    Derivations of Ordinary Class

    int main() {

    A obj1;

    B< int* > obj2;

    return 0;

    }

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    32/33

    Derivations of Ordinary Class

    A complete specialization may inherit from

    an ordinary class

    template< >

    class B< char* > : public A

    { };

  • 8/13/2019 Object Oriented Programming (OOP) - CS304 Power Point Slides Lecture 37

    33/33

    Derivations of Ordinary Class

    int main() {

    A obj1;

    B< char* > obj2;

    return 0;

    }