Upcoming SlideShare
×

# Virtual inheritance

605 views

Published on

1 Like
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
• Be the first to comment

Views
Total views
605
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
18
0
Likes
1
Embeds 0
No embeds

No notes for slide

### Virtual inheritance

1. 1. Illustration of the use of virtual inheritance. // // Virtual inheritance #include <iostream.h> typedef int HANDS; enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown } ; enum BOOL { FALSE, TRUE }; class Animal // common base to both horse and bird { public: Animal(int); virtual ~Animal() { cout << "Animal destructor...n"; } virtual int GetAge() const { return itsAge; } virtual void SetAge(int age) { itsAge = age; } private: int itsAge; }; Animal::Animal(int age): itsAge(age) { cout << "Animal constructor...n"; } class Horse : virtual public Animal { public: Horse(COLOR color, HANDS height, int age); virtual ~Horse() { cout << "Horse destructor...n"; } virtual void Whinny()const { cout << "Whinny!... "; } virtual HANDS GetHeight() const { return itsHeight; } virtual COLOR GetColor() const { return itsColor; } protected: HANDS itsHeight; COLOR itsColor; }; Horse::Horse(COLOR color, HANDS height, int age): Animal(age), itsColor(color),itsHeight(height) { cout << "Horse constructor...n"; } class Bird : virtual public Animal { public: Bird(COLOR color, BOOL migrates, int age);
2. 2. virtual ~Bird() {cout << "Bird destructor...n"; } virtual void Chirp()const { cout << "Chirp... "; } virtual void Fly()const { cout << "I can fly! I can fly! I can fly! "; } virtual COLOR GetColor()const { return itsColor; } virtual BOOL GetMigration() const { return itsMigration; }protected: COLOR itsColor; BOOL itsMigration;};Bird::Bird(COLOR color, BOOL migrates, int age): Animal(age), itsColor(color), itsMigration(migrates){ cout << "Bird constructor...n";}class Pegasus : public Horse, public Bird{public: void Chirp()const { Whinny(); } Pegasus(COLOR, HANDS, BOOL, long, int); ~Pegasus() {cout << "Pegasus destructor...n";} virtual long GetNumberBelievers() const { return itsNumberBelievers; } virtual COLOR GetColor()const { return Horse::itsColor; }private: long itsNumberBelievers;};Pegasus::Pegasus( COLOR aColor, HANDS height, BOOL migrates, long NumBelieve, int age):Horse(aColor, height,age),Bird(aColor, migrates,age),Animal(age*2),itsNumberBelievers(NumBelieve){ cout << "Pegasus constructor...n";}int main(){ Pegasus *pPeg = new Pegasus(Red, 5, TRUE, 10, 2); int age = pPeg->GetAge(); cout << "This pegasus is " << age << " years old.n";
3. 3. delete pPeg; return 0; }/ virtual members#include <iostream>using namespace std;class CPolygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; } virtual int area () { return (0); } };class CRectangle: public CPolygon { public: int area () { return (width * height); } };class CTriangle: public CPolygon { public: int area () { return (width * height / 2); } };int main () { CRectangle rect; CTriangle trgl; CPolygon poly; CPolygon * ppoly1 = &rect; CPolygon * ppoly2 = &trgl; CPolygon * ppoly3 = &poly; ppoly1->set_values (4,5); ppoly2->set_values (4,5); ppoly3->set_values (4,5); cout << ppoly1->area() << endl; cout << ppoly2->area() << endl; cout << ppoly3->area() << endl; return 0;}
4. 4. #include <iostream>using namespace std;class CPolygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; } virtual int area (void) =0; };class CRectangle: public CPolygon { public: int area (void) { return (width * height); } };class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } };int main () { CRectangle rect; CTriangle trgl; CPolygon * ppoly1 = &rect; CPolygon * ppoly2 = &trgl; ppoly1->set_values (4,5); ppoly2->set_values (4,5); cout << ppoly1->area() << endl; cout << ppoly2->area() << endl; return 0;}// pure virtual members can be called// from the abstract base class#include <iostream>using namespace std;class CPolygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; } virtual int area (void) =0; void printarea (void) { cout << this->area() << endl; } };class CRectangle: public CPolygon { public: int area (void) { return (width * height); } };
5. 5. class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } };int main () { CRectangle rect; CTriangle trgl; CPolygon * ppoly1 = &rect; CPolygon * ppoly2 = &trgl; ppoly1->set_values (4,5); ppoly2->set_values (4,5); ppoly1->printarea(); ppoly2->printarea(); return 0;}