240 likes | 343 Views
Inheritance. Chapter 12. Extending Class from other classes. We have seen basic class functions Data hiding (private, protected, public) Friend Functions Overloading ( functions, operators ) One of the most powerful elements of ADT is the ability to derive classes from other classes
E N D
Inheritance Chapter 12
Extending Class from other classes • We have seen basic class functions • Data hiding (private, protected, public) • Friend Functions • Overloading (functions, operators) • One of the most powerful elements of ADT is the ability to derive classes from other classes • This provides the ability to create new classes while retaining the basic characteristics of the original • This concept is called: Inheritance COMP 103 - Inheritance
Case Study: Simple Polygons Figure 12-1 COMP 103 - Inheritance
Polygon Base Class Figure 12-2 COMP 103 - Inheritance
Class Definition of Polygon Figure 12-3, Part I class Polygon { protected: double area; double perimeter; public: Polygon() {}; ~Polygon() {}; void printArea(); void printPeri(); }; // class Polygon COMP 103 - Inheritance
Private,Protected and Public • Private data and functions • Can only be accessed within the class • Protected data and functions • Can be accessed within the class as well as the derived class from this class • Public data and functions • Can be accessed by “everyone”. COMP 103 - Inheritance
Polygon :Function definition void Polygon :: printArea () { cout << "The area of your polygon is " << area << endl; } // Polygons printArea void Polygon :: printPeri () { cout << "The perimeter of your polygon is " << perimeter << endl; } // Polygons printPeri COMP 103 - Inheritance
Rectangle Object & Polygon Figure 12-3, Part III class Rectangle : public Polygon { private: double sideA, sideB; void calcArea(); void calcPeri(); public: Rectangle(double a, double b); }; COMP 103 - Inheritance
Derived Class Syntax • class derived_class_name : inheritance_type base_class_name • Example: • class Rectangle :public Polygons • class Rectangle :protected Polygons • class Rectangle :private Polygons • Inheritance rules: • All data members of the base object are inherited • All function members of the base object are inherited, except: a. Constructors b. Destructors c. friend functions d. Assignment operators COMP 103 - Inheritance
Inherited Data and Functions Inheritance of data and functions class Rectangle : public Polygon { private: double sideA, sideB; void calcArea(); void calcPeri(); protected: double area; double perimeter; public: Rectangle(double a, double b); void printArea(); void printPeri(); }; COMP 103 - Inheritance
Rectangle: Constructor and functions Rectangle::Rectangle(double A, double B) { sideA = A; sideB = B; calcPeri( ); // update perimeter field calcArea( ); // update area field } void Rectangle::calcPeri() { perimeter = 2*(sideA + sideB); } void Rectangle::calcArea() { area = sideA * sideB; } COMP 103 - Inheritance
Main( ) : using Rectangle type void main() { Rectangle rect(3,4); rect.printArea( ); rect.printPeri( ); } COMP 103 - Inheritance
Polygon: Triangle Object Figure 12-3, Part II class Triangle : public Polygon { private: double sideA, sideB, sideC; void calcArea(); void calcPeri(); public: Triangle(double a, double b, double c ); }; COMP 103 - Inheritance
Inheritance of data and functions class Triangle : public Polygon { private: double sideA, sideB, sideC; void calcArea(); void calcPeri(); protected: double area; double perimeter; public: Triangle(double a, double b, double c); void printArea(); void printPeri(); }; COMP 103 - Inheritance
Triangle: Constructor and Functions Triangle::Triangle(double A,double B,double C) { sideA = A; sideB = B; sideC = C; calcPeri(); // update perimeter field calcArea(); // update area field } void Triangle::calcPeri(){ perimeter = sideA + sideB + sideC; } void Triangle::calcArea(){ // Compute the area of a triangle based on // the given side lengths } COMP 103 - Inheritance
Main( ) : using Triangle type void main() { Triangle tri(3, 4, 5); tri.printArea(); tri.printPeri(); } void main() { Rectangle rect(3, 4); rect.printArea(); rect.printPeri(); } compared with COMP 103 - Inheritance
Base and Derived Class Access Note: This is confusing for C++ programmers COMP 103 - Inheritance
Another Example Derived Classes class EmpInfo : private SecurityEmp { . . . } ID (private) inaccessible Salary (protected) private Name (public) private Base Class class EmpInfo { private: int ID; protected: int Salary; public: char Name[200]; }; class EmpInfo : protected ImportantEmp { . . . }; ID (private) inaccessible Salary (protected) protected Name (public) protected class EmpInfo : public RegularEmp { . . . }; ID (private) inaccessible Salary (protected) protected Name (public) public COMP 103 - Inheritance
Inheritance types (p.601) • For all types, Private member data/functions in the base class are inaccessible in the derived class • Private (default type) • Protected and publicdata/functions in the base class become private in the derived class • Protected • Protected and public data/functions in the base class become protectedin the derived class • Public • Protected and public types are preserved! COMP 103 - Inheritance
Constructors and Derived Types • Since Constructors are not inherited, derived types must declare their own constructors, e.g. Polygon case. • When a derived class is constructed, it must first execute the constructor for the base class • Sometimes we need to pass data to the base class’ constructor (initialize constructor). How? with base-member-initialization list, e.g. Employee case. COMP 103 - Inheritance
Employee id : integer SalaryEmp HourlyEmp payRate : real salary : integer hours : real Figure 12-6 (p.608) Example: Employee Class (p.609-611) class Employee { protected: int id; public: Employee(int idIn); }; class SalaryEmp:public Employee { protected: int salary; public: SalaryEmp(int idIn, int sal); }; class HourlyEmp:public Employee { protected: float payrate, hours; public: HourlyEmp(int idIn, float rate); }; COMP 103 - Inheritance
Constructors Employee::Employee(int idIn) { id = idIn; } SalaryEmp::SalaryEmp(int idIn, int sal) : Employee(idIn) { salary = sal; } HourlyEmp::HourlyEmp(int idIn, float rate) : Employee(idIn) { payRate = rate; hours = 0.0; } pass idIn to Employee(idIn) constructor pass idIn to Employee(idIn) constructor COMP 103 - Inheritance
Base-Class-Initialization SalaryEmp::SalaryEmp(int idIn, int sal): Employee(idIn) { salary = sal; } • Explicit “base-class-initialization” - Employee(idIn) • Inherited-class constructor SalaryEmp::SalaryEmp(int idIn, int sal) calls the explicit-value base-class constructor Employee(idIn) COMP 103 - Inheritance
Summary • Polygon Case Study • Access types • Private, Protected, Public (Confusing part of C++) • Constructor initialization syntax • Employee example COMP 103 - Inheritance