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;

}

C++继承经典样例的更多相关文章

  1. Python类的继承演示样例

    class Pet: __name = "" def __init__(self, name): self.__name = name def bark(self): return ...

  2. Activiti的简单入门样例(经典的请假样例)

    经典的请假样例: 流程例如以下,首先须要部门经理审批.假设请假天数大于2天,则须要总经理审批,否则HR审批就可以 一:创建maven项目,项目结构例如以下: watermark/2/text/aHR0 ...

  3. Java线程演示样例 - 继承Thread类和实现Runnable接口

    进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...

  4. 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)

    3. 类.对象.继承和trait 3.1 类 3.1.1 类的定义 Scala中,可以在类中定义类.以在函数中定义函数.可以在类中定义object:可以在函数中定义类,类成员的缺省访问级别是:publ ...

  5. Log4j配置说明及样例

    一般的应用都会记录日志,Java圈里面用得最多就属log4j了,比较规范一点就是使用log4j.xml进行配置Log输出.这里就比较有疑问,多数情况是使用log4j.properties文件呐,前面也 ...

  6. JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  7. jbpm入门样例

    1.      jBPM的简介 jBPM是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储.    參考 http://www.jbos ...

  8. java设计模式演示样例

    创建模式 1.工厂方法模式(Factory Method)  将程序中创建对象的操作,单独出来处理,创建一个产品的工厂接口,把实际的工作转移到详细的子类.大大提高了系统扩展的柔性,接口的抽象化处理给相 ...

  9. java cglib动态代理原理及样例

     cglib动态代理: http://blog.csdn.net/xiaohai0504/article/details/6832990 一.原理 代理为控制要访问的目标对象提供了一种途径.当访问 ...

随机推荐

  1. vs2008,2010,2012安装包下载

    近期在csdn学院当老师啦.把自己以学到的东西总结一下,录个视频给大家,也当发一下福利.这些以后都是自己无形的財产.哈哈. 安装与下载编程工具 Vs2008下载地址:http://pan.baidu. ...

  2. 分类算法简介 分类: B10_计算机基础 2015-03-09 11:08 257人阅读 评论(0) 收藏

    一.决策树 决策树是用于分类和预测的主要技术之一,决策树学习是以实例为基础的归纳学习算法,它着眼于从一组无次序.无规则的实例中 推理出以决策树表示的分类规则.构造决策树的目的是找出属性和类别间的关系, ...

  3. 浅谈java中异常抛出后代码是否会继续执行

    问题 今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(int index, E element) ...

  4. IOS开发核心动画六:动画组

    #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...

  5. python开发环境设置(windows)

    python开发环境设置(windows) 1)  python2.7.3安装 在www.python.org上下载python-2.7.6.amd64.msi软件.安装完毕后设置path路径.控制面 ...

  6. Android 自定义RadioButton样式

     上面这种3选1的效果如何做呢?用代码写? 其实有更简单的办法,忘了RadioButton有什么特性了吗? 我就用RadioButton实现了如上效果,其实很简单的. 首先定义一张background ...

  7. java File类的基本使用

    package com.soar.file; import java.io.File; import java.io.IOException; public class Demo2_FileMetho ...

  8. [Jenkins] Define a pipeline

    node{ stage 'checkout' git '[github_url]' def project_path="[project_path]" // everythin i ...

  9. web网站如何实现兼容手机

    web网站如何实现兼容手机 一.总结 一句话总结:加上这句话即可:<meta name="viewport" content="width=device-width ...

  10. 用DOM4J包实现对xml文件按属性分离。

    转自本人博客:http://www.xgezhang.com/dom4j_xml_separata.html dom4j是一个Java的XML API.类似于jdom.用来读写XML文件的. dom4 ...