// 12. Публична, защитена и частна наследственост. // Kонструктури и деструктури в производни класове. // Многократна наследственост. // /*------------------------------------------------------- Публична, защитена и частна наследственост членове public protected private на б.клас inheritance inheritance inheritance public public protected private protected protected protected private private HIDDEN HIDDEN HIDDEN -------------------------------------------------------*/ // // Fig. 9.25: point4.h // Point4 class definition represents an x-y coordinate pair. #ifndef POINT4_H #define POINT4_H class Point4 { public: Point4( int = 0, int = 0 ); // default constructor ~Point4(); // destructor void setX( int ); // set x in coordinate pair int getX() const; // return x from coordinate pair void setY( int ); // set y in coordinate pair int getY() const; // return y from coordinate pair void print() const; // output Point3 object private: int x; // x part of coordinate pair int y; // y part of coordinate pair }; // end class Point4 #endif /****/ // Fig. 9.26: point4.cpp // Point4 class member-function definitions. #include using std::cout; using std::endl; #include "point4.h" // Point4 class definition // default constructor Point4::Point4( int xValue, int yValue ) : x( xValue ), y( yValue ) { cout << "Point4 constructor: "; print(); cout << endl; } // end Point4 constructor // destructor Point4::~Point4() { cout << "Point4 destructor: "; print(); cout << endl; } // end Point4 destructor // set x in coordinate pair void Point4::setX( int xValue ) { x = xValue; // no need for validation } // end function setX // return x from coordinate pair int Point4::getX() const { return x; } // end function getX // set y in coordinate pair void Point4::setY( int yValue ) { y = yValue; // no need for validation } // end function setY // return y from coordinate pair int Point4::getY() const { return y; } // end function getY // output Point4 object void Point4::print() const { cout << '[' << getX() << ", " << getY() << ']'; } // end function print /****/ // Fig. 9.27: circle5.h // Circle5 class contains x-y coordinate pair and radius. #ifndef CIRCLE5_H #define CIRCLE5_H #include "point4.h" // Point4 class definition class Circle5 : public Point4 { public: // default constructor Circle5( int = 0, int = 0, double = 0.0 ); ~Circle5(); // destructor void setRadius( double ); // set radius double getRadius() const; // return radius double getDiameter() const; // return diameter double getCircumference() const; // return circumference double getArea() const; // return area void print() const; // output Circle5 object private: double radius; // Circle5's radius }; // end class Circle5 #endif /****/ // Fig. 9.28: circle5.cpp // Circle5 class member-function definitions. #include using std::cout; using std::endl; #include "circle5.h" // Circle5 class definition // default constructor Circle5::Circle5( int xValue, int yValue, double radiusValue ) : Point4( xValue, yValue ) // call base-class constructor { setRadius( radiusValue ); cout << "Circle5 constructor: "; print(); cout << endl; } // end Circle5 constructor // destructor Circle5::~Circle5() { cout << "Circle5 destructor: "; print(); cout << endl; } // end Circle5 destructor // set radius void Circle5::setRadius( double radiusValue ) { radius = ( radiusValue < 0.0 ? 0.0 : radiusValue ); } // end function setRadius // return radius double Circle5::getRadius() const { return radius; } // end function getRadius // calculate and return diameter double Circle5::getDiameter() const { return 2 * getRadius(); } // end function getDiameter // calculate and return circumference double Circle5::getCircumference() const { return 3.14159 * getDiameter(); } // end function getCircumference // calculate and return area double Circle5::getArea() const { return 3.14159 * getRadius() * getRadius(); } // end function getArea // output Circle5 object void Circle5::print() const { cout << "Center = "; Point4::print(); // invoke Point4's print function cout << "; Radius = " << getRadius(); } // end function print /****/ // Fig. 9.29: fig09_29.cpp // Display order in which base-class and derived-class // constructors are called. #include using std::cout; using std::endl; #include "circle5.h" // Circle5 class definition int main() { { // begin new scope Point4 point( 11, 22 ); } // end scope cout << endl; Circle5 circle1( 72, 29, 4.5 ); cout << endl; Circle5 circle2( 5, 5, 10 ); cout << endl; return 0; // indicates successful termination } // end main /************************************************/ // Fig. 9.11: base1.h // Definition of class Base1 #ifndef BASE1_H #define BASE1_H class Base1 { public: Base1( int x ) { value = x; } int getData() const { return value; } protected: // accessible to derived classes int value; // inherited by derived class }; #endif /****/ // Fig. 9.11: base2.h // Definition of class Base2 #ifndef BASE2_H #define BASE2_H class Base2 { public: Base2( char c ) { letter = c; } char getData() const { return letter; } protected: // accessible to derived classes char letter; // inherited by derived class }; #endif /****/ // Fig. 9.11: derived.h // Definition of class Derived which inherits // multiple base classes (Base1 and Base2). #ifndef DERIVED_H #define DERIVED_H #include "base1.h" #include "base2.h" // multiple inheritance class Derived : public Base1, public Base2 { friend ostream &operator<<( ostream &, const Derived & ); public: Derived( int, char, double ); double getReal() const; private: double real; // derived class's private data }; #endif /****/ // Fig. 9.11: derived.cpp // Member function definitions for class Derived #include #include "derived.h" // Constructor for Derived calls constructors for // class Base1 and class Base2. // Use member initializers to call base-class constructors Derived::Derived( int i, char c, double f ) : Base1( i ), Base2( c ), real ( f ) { } // Return the value of real double Derived::getReal() const { return real; } // Display all the data members of Derived ostream &operator<<( ostream &output, const Derived &d ) { output << " Integer: " << d.value << "\n Character: " << d.letter << "\nReal number: " << d.real; return output; // enables cascaded calls } /*************************/ // Fig. 9.11: fig09_11.cpp // Driver for multiple inheritance example #include #include "base1.h" #include "base2.h" #include "derived.h" int main() { Base1 b1( 10 ), *base1Ptr = 0; // create Base1 object Base2 b2( 'Z' ), *base2Ptr = 0; // create Base2 object Derived d( 7, 'A', 3.5 ); // create Derived object // print data members of base class objects cout << "Object b1 contains integer " << b1.getData() << "\nObject b2 contains character " << b2.getData() << "\nObject d contains:\n" << d << "\n\n"; // print data members of derived class object // scope resolution operator resolves getData ambiguity cout << "Data members of Derived can be" << " accessed individually:" << "\n Integer: " << d.Base1::getData() << "\n Character: " << d.Base2::getData() << "\nReal number: " << d.getReal() << "\n\n"; cout << "Derived can be treated as an " << "object of either base class:\n"; // treat Derived as a Base1 object base1Ptr = &d; cout << "base1Ptr->getData() yields " << base1Ptr->getData() << '\n'; // treat Derived as a Base2 object base2Ptr = &d; cout << "base2Ptr->getData() yields " << base2Ptr->getData() << endl; return 0; }