Object-Oriented Design
Object-Oriented Design
• Method for designing computer programs
• Consider “objects” interacting in the program– Example: a zoo
OOD Goals
• Robustness– Gracefully handle failures
• Adaptability– Evolve as necessary
• Reusability– Many programs use same piece of code
OOD Principles
• Abstraction– Abstract Data Types (ADTs)– Interfaces
• Encapsulation– Information Hiding
• Modularity– Easily plug together components
Inheritance
• Many objects have a hierarchical relationship– Examples: zoo
• Inheritance allows software design to take advantage of relationships
Terminology
• Base class/Parent class/Superclass– defines generic functionality
• Derived class/Child class/Subclass– extends or specializes base class – inherits members of parent– may implement new members– may override members of parent
Examples
• Card Game
• Airline Reservation System
Syntax
class Student : public Person {…}
class Derived : public Base{…}
• Derived class may override or reimplement a function implemented by base class
class Person { class Student:public Person{
… …
void print(); void print();
} }
Function Invocation
• Person – print, getName• Student – print, changeMajor
Person p(…);
Student s(…);
s.getName();
p.print();
s.print();
p.changeMajor();
s.changeMajor();
Function Invocation
• Person – print, getName• Student – print, changeMajor
Person p(…);
Student s(…);
s.getName(); //Person::getName
p.print(); //Person::print
s.print(); //Student::print
p.changeMajor(); //ERROR!!!!!!!!
s.changeMajor(); //Student::changeMajor
More Syntax
void Person::print() {…}
void Student::print() {Person::print();
//Superclass::function();
…
}
Protected
• private members of parent not accessible to child class
• protected members accessible only to derived classes
• examples
class classname {private:protected:public:
}
Child Class Constructors
• Subclass must create superclass– invoke superclass constructor from subclass
constructor– use initializer list
Student::Student(string newname, string newmajor)
:Person(newname), major(newmajor) {…}
Student::Student(string newname, string newmajor)
:Person(newname) {major = newmajor;}
Static Binding
Person* p = new Person(…);Student* s = new Student(…);p->print(); //calls Person::print()p = s; //OKAYp->print(); //calls Person::print()p->changeMajor(); //ERROR
• Function called depends on declared type
Dynamic Binding
• May want to determine which function to call based on object contents
• Use virtual functions
class Person {virtual void print();
}class Student : public Person {
virtual void print();}
Dyanmic Binding
Person* p = new Person(…);
Student* s = new Student(…);
p->print(); //calls Person::print()
p = s; //OKAY
p->print(); //calls Student::print()
p->changeMajor(); //ERROR
Polymorphism
• Many forms
• A variable is polymorphic if it points to an object with 1 or more virtual functions
Casting
Person* p;
p = new Student(…);
Student* s = dynamic_cast<Student*>(p);
• Create new pointer of subclass type to point to object
• Pointer (s in this case) will be NULL if cast was NOT successful
• Can also use C-style cast
Abstract Classes
• May want to defined base class which cannot be instantiated– Examples – bank account, car
• Declare one or more functions as pure virtual
virtual void print() = 0;
virtual void func_name(…) = 0;
Templates
template <typename Object>
class BasicVector {}
BasicVector<int> iv(5);
BasicVector<string> sv(100);
• Define classes which can hold any type of object
Exceptions
• If error occurs during runtime, report and continue execution– Example: array index, divide by 0
• Exceptions are also classes– programmer defines
try {//call func that throws exception
} catch(ExceptionType& et) {//e.g., print error
} catch(…) { //catch all exceptions }
void func() throw(ExceptionType) {…}