240 likes | 349 Vues
This chapter delves into the concept of inheritance in object-oriented programming, highlighting how new classes can be derived from existing ones while retaining their core characteristics. It covers the fundamentals of class functions, data hiding (private, protected, public), friend functions, and operator overloading. The practical application of inheritance is exemplified through a case study of simple polygons, including class definitions for Polygon, Rectangle, and Triangle. Inheritance rules, data access levels, and the significance of constructors and functions are also discussed to provide a comprehensive overview.
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