Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Intro to C++
Lecture Topics
Inheritance and polymorphism
These notes are taken from Eunsuk Kang & JeanYang @ MIT.
SP16 1 V. Kindratenko
ECE 220 Lecture 24 April 21, 2016
Inheritance
A class defines a set of objects, or a type, e.g., all University people
Some objects are distinct from others in some ways, e.g., University students vs. University
professors, but they all are still University people
o University professor and student are subtypes of University people
#include <string>
class Person
{
protected:
int id;
string name;
string address;
public:
Person(int id, string name, string address);
~Person();
void displayProfile();
void changeAddress(string newAddress);
};
SP16 2 V. Kindratenko
ECE 220 Lecture 24 April 21, 2016
Person::~Person() { }
void Person::displayProfile()
{
cout << "-----------------------------\n";
cout << "Name: " << name << " ID: " << id <<;
cout << " Address: " << address << "\n";
cout << "-----------------------------\n";
}
Subtype: Student
SP16 3 V. Kindratenko
ECE 220 Lecture 24 April 21, 2016
void Student::displayProfile()
{
cout << "--------------------------" << endl;
cout << "Name: " << name << ", ID: " << id;
cout << ", Address: " << address << endl;
cout << "Course: " << course << ", year: " << year << endl;
cout << "--------------------------" << endl;
james->addClassTaken(220);
john->displayProfile();
james->displayProfile();
Polymorphism
Ability of type A to appear as and be used like another type B
o e.g., a Student object can be used in place of an Person object
Actual type vs. declared type
o Every variable has a declared type at compile-time
o But during runtime, the variable may refer to an object with an actual type (either the
same or a subclass of the declared type)
steve->displayProfile();
SP16 4 V. Kindratenko
ECE 220 Lecture 24 April 21, 2016
class Person
{
…
virtual void displayProfile();
};
o Calling a virtual function
SP16 5 V. Kindratenko
ECE 220 Lecture 24 April 21, 2016
Person* p = Person(...);
Student* s1 = static_cast<Student*>(p); // s1 is not checked!
Student* s2 = dynamic_cast<Student*>(p); // s2 is set to NULL
o Use “static_cast<...>” only if you know what you are doing!
class BST
{
public:
virtual ~BST() = 0;
virtual void insert(int val) = 0;
virtual bool find(int val) = 0; // “find” is pure
SP16 6 V. Kindratenko
ECE 220 Lecture 24 April 21, 2016
int main()
{
BST *bst = new BST(); // cannot do this
}
o Its subclass must implement all of the pure virtual functions:
public:
NodeBST();
~NodeBST();
};
SP16 7 V. Kindratenko