c++继承经典例子

//c++继承经典例子

#include <iostream.h>

 

class Base

{

private:

      int b_number;

public:

      Base( ){}

      Base(int i) : b_number (i) { }

      int get_number( ) {return b_number;}

      void print( ) {cout << b_number << endl;}       

};

 

class Derived : public Base

{

private:

      int d_number;

 

public:

      // constructor, initializer used to initialize the base part of a Derived object.

      Derived( int i, int j ) : Base(i), d_number(j) { };       

      // a new member function that overrides the print( ) function in Base

      void print( )

      {

            cout << get_number( ) << " ";       

            // access number through get_number( )

            cout << d_number << endl;

      }

};

 

int main( )

{

      Base a(2);

      Derived b(3, 4);

 

      cout << "a is ";

      a.print( );                // print( ) in Base

      cout << "b is ";

      b.print( );                // print( ) in Derived

      cout << "base part of b is ";

      b.Base::print( );                // print( ) in Base

 

      return 0;

}

 

 

//--------------------------------------------------------------------------------

 

//没有虚析构函数,继承类没有析构

//Example:  non- virtual destructors for dynamically allocated objects.

#include <iostream.h>

#include <string.h>

 

class Thing

{ public:

virtual void what_Am_I( ) {cout << "I am a Thing./n";}

~Thing(){cout<<"Thing destructor"<<endl;}

};

 

class Animal : public Thing

{ 

public:

      virtual void what_Am_I( ) {cout << "I am an Animal./n";}

      ~Animal(){cout<<"Animal destructor"<<endl;}

};

 

void main( )

{

      Thing *t =new Thing;     

      Animal*x = new Animal;

      Thing* array[2];

 

      array[0] = t;                                // base pointer

      array[1] = x;               

 

      for (int i=0; i<2; i++)  array->what_Am_I( ) ;

 

      delete array[0];

      delete array[1];

      return ;

}

 

 

//--------------------------------------------------------------------------------

//纯虚函数,多态

#include <iostream.h>

#include <math.h>

 

class Point

{

private:

      double x;

      double y;

public:

      Point(double i, double j) : x(i), y(j) { }

      void print( ) const

      { cout << "(" << x << ", " << y << ")"; }

};

 

class Figure

{

private:

      Point center;

public:

      Figure (double i = 0, double j = 0) : center(i, j) { }        

 

      Point& location( )

      {

            return center;

      }                  // return an lvalue

      void move(Point p)

      {

            center = p;

            draw( );

      }

 

      virtual void draw( ) = 0; // draw the figure

      virtual void rotate(double) = 0;

      // rotate the figure by an angle               

};

 

class Circle : public Figure

{

private:

      double radius;

public:

      Circle(double i = 0, double j = 0, double r = 0) : Figure(i, j), radius(r) { }

      void draw( )

      {

            cout << "A circle with center ";

            location( ).print( );

            cout << " and radius " << radius << endl;

      }

      void rotate(double)

      {

            cout << "no effect./n";

      }        // must be defined

};

 

class Square : public Figure

{

private:

      double side;        // length of the side

      double angle;        // the angle between a side and the x-axis

public:

      Square(double i = 0, double j = 0, double d = 0, double a = 0)        : Figure(i, j), side(d), angle(a) { }

      void draw( )

      {

            cout << "A square with center ";

            location( ).print( );

            cout << " side length " << side << "./n" 

                  << "The angle between one side and the X-axis is " << angle << endl;

      }

      void rotate(double a)

      {

            angle += a;

            cout << "The angle between one side and the X-axis is " << angle << endl;

      }

      void vertices( )

      {

            cout << "The vertices of the square are:/n";

            // calculate coordinates of the vertices of the square

      }

};

 

int main( )

{

      Circle c(1, 2, 3);

      Square s(4, 5, 6);

      Figure *f = &c, &g = s;

 

      f -> draw( );

      f -> move(Point(2, 2));

 

      g.draw( );

      g.rotate(1);

 

      s.vertices( );

      // Cannot use g here since vertices( ) is not a member of Figure.

 

      return 0;

}

#include <iostream.h>

#include <string.h>

 

class Thing

{

public:

      virtual void what_Am_I( ) {cout << "I am a Thing./n";}

 

      ~Thing(){cout<<"Thing destructor"<<endl;}

};

 

class Animal : public Thing

{

public:

      virtual void what_Am_I( ) {cout << "I am an Animal./n";}

 

      ~Animal(){cout<<"Animal destructor"<<endl;}

};

 

void main( )

{

      Thing t ;

      Animal x ;

      Thing* array[2];

 

      array[0] = &t;                        // base pointer

      array[1] = &x;       

      for (int i=0; i<2; i++)  array->what_Am_I( ) ;

 

      return ;

}

 

 

//--------------------------------------------------------------------------------

 

//多继承

 

#include <iostream.h>

 

class A

{

private:

      int a;

public:

      A(int i) : a(i) { }

      virtual void print( )        {cout << a << endl;}

      int get_a( ) {return a;}

};

 

class B

{

private:

      int b;

public:

      B(int j) : b(j) { }

      void print( )        {cout << b << endl;}

      int get_b( ) {return b;}

};

 

class C : public A, public B

{

      int c;

public:

      C(int i, int j, int k) : A(i), B(j), c(k) { }

      void print( )        {A::print( ); B::print( );}

      // use print( ) with scope resolution

      void get_ab( )        {cout << get_a( ) << " " << get_b( ) << endl;}

      // use get_a( ) and get_b( ) without scope resolution

};

 

int main( )

{

      C x(5, 8, 10);

      A* ap = &x;

      B* bp = &x;

 

      ap -> print( );                // use C::print( );

      bp -> print( );                // use B::print( );

      //        bp -> A::print( );                // as if x is inherited from B only,

      // cannot access A::print( );

      x.A::print( );                // use A::print( );

      x.get_ab( );

 

      return 0;

}

 

 

//--------------------------------------------------------------------------------

//共同基类的多继承

#include <iostream.h>

class R

{

      int r;

public:

      R(int anInt){ r = anInt;};

      printOn(){ cout<<"r="<<r<<endl;} ;

};

 

class A : public R

{

      int a;

public:

      A(int int1,int int2):R(int2){ a = int1;};

};

 

class B : public R

{

      int b;

public:

      B(int int1,int int2):R(int2){ b = int1;};

};

 

class C : public A, public B

{

      int c;

public:

      C(int int1,int int2, int int3):A(int2,int3), B(int2,int3){ c = int1;}

};

 

int main( )

{   

      int i;

      R rr(10);     

      A aa(20,30);     

      B bb (40,50);

      C cc(5, 7, 9);

      rr.printOn();   

      aa.printOn();                  //inherits R printOn 

      bb.printOn();                   //inherits R printOn

      //cc.printOn();                  //would give error

      return 0;

}

 

//--------------------------------------------------------------------------------

//虚基类

#include <iostream.h>

 

class R

{

      int r;

public:

      R (int x = 0) : r(x) { }   // constructor in R

      void f( ){ cout<<"r="<<r<<endl;}    

      void printOn(){cout<<"printOn R="<<r<<endl;}

};

 

class A : public virtual R

{  int a;

public:

      A (int x, int y) : R(x), a(y)  { } // constructor in A

      void f( ){ cout<<"a="<<a<<endl;R::f();}

};

 

class B : public virtual R

{int b;

public:

      B(int x, int z) : R(x), b(z) { }// constructor in B

      void f( ){ cout<<"b="<<b<<endl;R::f();}

};

 

class C : public A, public B

{ int c;

public:

      // constructor in C, which constructs an R object first

      C(int x, int y, int z, int w) : R(x), A(x, y), B(x, z), c(w) { }

 

      void f( ){ cout<<"c="<<c<<endl;A::f(); B::f();}

};

 

void main()

{  R rr(1000);

A aa(2222,444);

B bb(3333,111);

C cc(1212,345,123,45);

cc.printOn();     //uses R printOn but only 1 R..no ambiguity

cc.f();                // shows multiple call of the R::f()

}

 

 

 

#include <iostream.h>

 

class R

{ int r;

public:

      R (int x = 0) : r(x) { }   // constructor in R

      void f( ){ cout<<"r="<<r<<endl;}

};

 

class A : virtual public R

{ int a ;

protected:

      void fA( ){cout<<"a="<<a<<endl;};

 

public:

      A (int x, int y) : R(x), a(y)  { } // constructor in A

      void f( ) {fA( ); R::f( );}

};

 

class B : virtual public R

{  int b;

protected:

      void fB( ){cout<<"b="<<b<<endl;};

public:

      B (int x, int y) : R(x), b(y)  { } // constructor in A

      void f( ) {fB( ); R::f( );}

};

 

 

class C : public A, public B

{ int c;

 

protected:

      void fC( ){ cout<<"c="<<c<<endl;};       

public:

      C(int x, int y, int z, int w) : R(x), A(x, y), B(x, z), c(w) { }

 

      void f( )

      { 

            R::f( );                    // acts on R stuff only

            A::fA( );            //acts on A stuff only

            B::fB( );                   // acts on B stuff only

            fC( );                  // acts on C stuff only

      }

};

 

void main()

{ 

      R rr(1000);

      A aa(2222,444);

      B bb(3333,111);

      C cc(1212,345,123,45);

      cc.f();

}

 

 

 

 

//--------------------------------------------------------------------------------

//私有继承

// Access levels

 

#include <iostream.h>

 

class Base

{

private:

      int priv;

protected:

      int prot;

      int get_priv( ) {return priv;}

public:

      int publ;

      Base( );

      Base(int a, int b, int c) : priv(a), prot(b), publ(c) { }

      int get_prot( ) {return prot;}

      int get_publ( ) {return publ;}

};

 

class Derived1 : private Base        // private inheritance

{

public:

      Derived1 (int a, int b, int c) : Base(a, b, c) { }

      int get1_priv( ) {return get_priv( );}

      // priv not accessible directly

      int get1_prot( ) {return prot;}

      int get1_publ( ) {return publ;}

};

 

class Leaf1 : public Derived1

{

public:

      Leaf1(int a, int b, int c) : Derived1(a, b, c) { }

      void print( )

      {

            cout << "Leaf1 members: " << get1_priv( ) << " "

                  //                        << get_priv( )        // not accessible

                  << get1_prot( ) << " "

                  //                        << get_prot( )         // not accessible

                  //                        << publ         // not accessible

                  << get1_publ( ) << endl;

      }  // data members not accessible.  get_ functions in Base not accessible

};

 

class Derived2 : protected Base // protected inheritance

{

public:

      Derived2 (int a, int b, int c) : Base(a, b, c) { }

};

 

class Leaf2 : public Derived2

{

public:

      Leaf2(int a, int b, int c) : Derived2(a, b, c) { }

      void print( )

      {

            cout << "Leaf2 members: " << get_priv( ) << " "

                  //                        << priv                 // not accessible

                  << prot << " "

                  << publ << endl;

      }  // public and protected data members accessible.  get_ functions in Base accessible.

};

 

class Derived3 : public Base  // public inheritance

{

public:

      Derived3 (int a, int b, int c) : Base(a, b, c) { }

};

 

class Leaf3 : public Derived3

{

 

public:

      Leaf3(int a, int b, int c) : Derived3(a, b, c) { }

      void print( )

      {

            cout << "Leaf3 members: " << get_priv( ) << " "

                  << prot << " "

                  << publ << endl;

      }  // public and protected data members accessible.  get_ functions in Base accessible

};

 

int main( )

{

      Derived1 d1(1, 2, 3);

      Derived2 d2(4, 5, 6);

      Derived3 d3(7, 8, 9);

 

      //        cout << d1.publ;                // not accessible

      //        cout << d1.get_priv( );        // not accessible

      //        cout << d2.publ;                // not accessible

      //        cout << d2.get_priv( );        // not accessible

      cout << d3.publ;                // OK

      cout << d3.get_prot( );        // OK

 

      Leaf1 lf1(1, 2, 3);

      Leaf2 lf2(4, 5, 6);

      Leaf3 lf3(7, 8, 9);

 

      //         cout << lf1.publ << endl;                    // not accessible

      //         cout << lf2.publ << endl;                // not accessible

      cout << lf3.publ << endl;                 // OK

 

      return 0;

}

 

 

//--------------------------------------------------------------------------------

//多级继承

// Point-Circle-Cylinder

#include <iostream.h>

 

// THE POINT CLASS

 

class Point

{

      friend ostream & operator<<(ostream &,Point &);

 

public:

 

      //  constructor

      Point (double xval =0, double yval=0 )

      { x=xval; y=yval;};  

 

protected:       // accessed by derived class

      double  x;

      double  y;

};

 

ostream & operator << (ostream & os,

                                 Point &  apoint)

{

      cout <<" Point:X:Y: "<<apoint.x << ","

            << apoint.y<< "/n";

      return os; 

}

 

//The Circle class  inherits from class Point

 

class Circle : public Point

{

      friend ostream & operator<<(ostream &,Circle&);

 

public:

      Circle (double r=0,double xval=0,double yval=0)

            :Point(xval,yval), radius(r)

      {

            //radius = r;

      }

 

      double area()

      {

            return (3.14159* radius *radius);

      }

 

protected:

      double radius;

};

 

 

//note casting circle to point

ostream & operator <<(ostream & os, Circle & aCircle)

{

      cout<< "Circle:radius:" << aCircle.radius;

      os<< aCircle.x << "/n";

      os<< aCircle.y << "/n";       

      return os;     

}

 

// THE CYLINDER CLASS

class  Cylinder  : public Circle

{

      friend ostream & operator << (ostream & ,Cylinder &);

 

public:

      Cylinder (double hv=0,double rv=0,

            double xv=0,double yv=0 )

            : Circle( xv,yv,rv)

      {

            height = hv;

      }        

 

      double  area ( );

 

protected:     // may have derived classes

      double  height;

};

 

double Cylinder :: area ( )

{ // Note that cylinder area uses Circle area

      return  2.0* Circle::area() + 2.0*3.14159* radius*height;

}

 

ostream & operator << (ostream & os,

                                 Cylinder & acylinder)

 

{

      cout << "cylinder dimensions: ";

      cout << "x: " <<acylinder.x;

      cout << "  y: " <<acylinder.y ;

      cout << "  radius: " <<acylinder.radius ;

      cout << "  height: " <<acylinder.height

            << endl;

      return os;

}

 

int main(void)

{

      Point p(2,3);

      Circle c(7,6,5);

      Cylinder cyl(10,11,12,13);

      cout << p;

 

      cout << c;

      cout << "area of cirle:" << c.area() << endl;

 

      cout<< cyl;

      cout<<"area of cylinder:"<< cyl.area()<<endl ;

 

      cout<<"area of cylinder base is " 

            << cyl.Circle::area() << endl;

 

      return 0;

}

 

 

//--------------------------------------------------------------------------------

//protected 访问控制属性在继承的意义

//Example of treating derived class object as base class objects. Point------Circle

 

#include <iostream.h>

// THE POINT CLASS

 

class Point

{

      friend ostream & operator<<(ostream &,Circle&);

public:

      Point (double xval =0, double yval=0 ) { x=xval; y=yval;};  

 

public:

      void print()

      {

            cout <<" Point:X:Y: "<<x << "," <<y<< "/n";

      }

 

protected:       // accessed by derived class

      double  x;    double  y;

};

 

ostream & operator << (ostream & os, Point &  apoint)

{

      cout <<" Point:X:Y: "<<apoint.x << ","<< apoint.y<< "/n";

      return os; 

}

 

 

//The Circle class  inherits from class Point

class Circle : public Point

{

 

      friend ostream & operator<<(ostream &,Circle&);

 

public:

      Circle (double r=0,double xval=0,double yval=0):Point(xval,yval)

      { radius = r;};

 

      void print()

      {

            cout<< "Circle:radius:" <<radius<<endl;

            cout <<" Point:X:Y: "<<x << "," <<y<< "/n";

      }

 

      double area()

      { return (3.14159* radius *radius);};

 

protected:

      double radius;

};

 

//note casting circle to point

ostream & operator <<(ostream & os, Circle & aCircle)

{

      cout<< "Circle:radius:" << aCircle.radius;

      cout<< (Point) aCircle << "/n";          

      return os;     

}

 

 

//We will look at a few main programs based on previous class definitions. Casting and assignments

void main (void )

{

      Point p(2,3);         cout <<"Point P=  "<< p;

 

      Point pp(0,0);       cout <<"Point PP=  "<< pp;

 

      Circle c(7,6,5);     cout <<"Circle c=  "<< c;        //radius =7

 

      pp = p;             cout <<"Point PP=  "<< pp;    //built in assign =

 

      // a circle is a member of the point class so assign a circle to a point.

 

      pp = c;           //legal; also assignment O.K.

      cout <<"Point PP=  "<< pp;

 

      pp= (Point) c;    // but better  use the cast

      cout <<"Point PP=  "<< pp;  //note we get only the point part of the Circle

 

      //c = (Circle) pp;   //  illegal Cannot convert 'class Point' to 'class Circle'

 

      //c=pp;                 //illegal assignment not defined

 

      Point*  p;

      p = &c;

 

      P->print();    //call base class print

      ((Circle*)p)->print();

 

      Point& r = c;

      r.print();

      ((Circle&)r).print();

 

}

 

 

//--------------------------------------------------------------------------------

//类的兼容性规则

 

#include <iostream.h>

 

class Base

{

public: 

      void func( )

      {cout << "Base class function./n";}

};

 

class Derived : public Base

{

public: 

      void func( )

      {cout << "Derived class function./n";}

};

 

void foo(Base b)

{ b.func( ); }

 

int main( )

{

      Derived d;

      Base b;

      Base * p = &d;

      Base& br = d;

 

      b = d;

      b.func( );

      d.func( );

      p -> func( );

      foo(d);

      br.func( );

 

      return 0;

}

 

 

//--------------------------------------------------------------------------------

//虚析构函数,防止内存泄露

#include <iostream.h>

#include <string.h>

 

class Base

{

protected:

      int id;

      char * name;

public:

      // default constructor

      Base(int a = 0, char * s = "") : id(a)

      {

            if (!s)

            {

                  name = NULL;

            }

            else

            {

                  name = new char[strlen(s) + 1];

                  strcpy(name, s);

            }

            cout << "base default constructor/n";

      }

      // copy constructor

      Base(const Base& b) : id(b.id)

      {

            if (!b.name) { name = NULL; }

            else

            {

                  name = new char[strlen(b.name) + 1];

                  strcpy(name, b.name);

            }

            cout << "base copy constructor/n";

      }

      // destructor

      ~Base( )

      {

            if( name != NULL )        delete [ ] name;

            cout << "base destructor/n";

      }

      const Base& operator= (const Base& b);               

      friend ostream& operator << (ostream&, const Base&);

};

 

const Base& Base:perator= (const Base& b)

{

      if (this != &b)                        // Check if an object is assigned to itself.

      {

            id = b.id;

            delete [ ] name;                //  Destroy the old object.

            if (!b.name) { name = NULL; }

            else

            {

                  name = new char[strlen(b.name) + 1];

                  strcpy(name, b.name);

            }

      }

      cout << "base assignment operator/n";

      return *this;

}

 

ostream& operator << (ostream& out, const Base& b)

{

      out << "Base member id = " << b.id << endl;

      out << "Base member name = " << b.name << endl;

 

      return out;

}

 

class Derived : public Base

{

private:

      float f;

      char * label;

public:

      // default constructor

      Derived(int a = 0, char * s = "", float x = 0, char * t = "") : Base(a, s), f(x)

      {

            if (!t) { label = NULL; }

            else

            {

                  label = new char [strlen(t) + 1];

                  strcpy(label, t);

            }

            cout << "derived default constructor/n";

      }

      // copy constructor

      Derived(const Derived& d) : Base(d), f(d.f)

            // d used as an instance of Base

      {

            if(!d.label) { label = NULL; }

            else

            {

                  label = new char [strlen(d.label) + 1];

                  strcpy(label, d.label);

            }

            cout << "derived copy constructor/n";

      }

      // destructor

      ~Derived( )         

      {

            delete [ ] label;

            cout << "derived destructor/n";

      }

      const Derived& operator= (const Derived& d);

      friend ostream& operator << (ostream&, const Derived&);

};

 

const Derived& Derived:perator= (const Derived& d)

{

      if (this != &d)

      {

            delete [ ] label;

        Base:perator=(d); 

            //  Assign the Base part of d to the Base

            // part of the object that calls this operator;

            f = d.f;

            if (!d.label) { label = NULL; }

            else

            {

                  label = new char [strlen(d.label) + 1];

                  strcpy(label, d.label);

            }

            cout << "derived assignment operator/n";

      }

      return *this;

}

 

ostream& operator << (ostream& out, const Derived& d)

{

      out << (Base)d;               

      // Convert d to Base object to output Base members.

      out << "Derived member f = " << d.f << endl;

      out << "Derived member label = " << d.label << endl;

      return out;

}

 

int main( )

{

      Derived d1;

      Derived  d2(d1);

 

      return 0;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值