C++ <三>

//多重继承,虚继承(菱形),虚基类。

//fraction[分数]

/*#include<iostream>

 

 using namespace std;

 

 

 using namespace std;

class Fract{

       int n;

       int d;

public:

       Fract():n(0),d(1){}

       Fract(int an,int ad):n(an),d(ad){

              reduce();

       }//先看每个函数的声明,再去看函数体的东西。 所以可用reduce()函数。

       void reduce(){

              if(d<0){d=-d;n=-n;}

              if(d==0){ cout<<"ERROR!!,分母不能为零。"<<endl;

              int absn=abs(n);

              for(int i=(absn<d?absn:d);i>1;--i){

                     if(absn%i==0&d%i==0){

                            n/=i,d/=i;

                     }

       }

 

 

              }

       void show(){

                     cout<<n<<"/"<<d<<endl;

              }

       double value(){

                     return  (double)n/d;

              }

};

       int main()

       {

              Fract f1(12,16);

       }*/

/*

#include<iostream>

using namespace std;

 

class Fract{

       int n;

       int d;

public:

       Fract():n(0),d(1){}

       Fract(int an, int ad): n(an),d(ad){

              reduce();

       }

       void reduce(){

              if(d<0){n=-n;d=-n;}

              if(d==0)  cout<<"ERROR!! 分母不能为零。"<<endl;

              int absn=abs(n);

              for(int i=d;i>1;--i){

                     if(absn%i==0&&d%i==0){

                            n/=i;

                            d/=i;

                     }

              }

 

 

       }

  virtual void show(){// 虚函数 virtual函数

              cout<<n<<"/"<<d<<endl;

       }

    virtual     double value(){//使用多态, 调用它是为子类相对应的方法。

      

       return (double)n/d;

       }

};

class Dai:public Fract{

 int Int;

public:

      

       Dai(int ai ,int an,int ad):Int(ai),Fract(an,ad){};

       void show(){

              cout<<Int<<"(";

              Fract::show();

      

       }

double value(){

       return Int+Fract::value();

}

 

 

};

int main()

{

       Fract a(12,16);

       Fract *p=NULL;

       p=&a;

       p->show();

cout<<"a="<<p->value()<<endl;

       Dai b(1,2,4);

       p=&b;

       p->show();//以对象的真实身份来调用相对应的function.

 

       cout<<"b="<<p->value()<<endl;

       Fract& f=b;//引用

       f.show();//根据子类的真实身份去调用虚函数。virtual函数

       cout<<"b="<<f.value()<<endl;

       Fract f3=f; //至少用f来初始化,   “一桶水来初始化一个杯子”

       f3.show();//f3为Fract类型对象

 

 

}

*/

/*

#include<iostream>

#include<string>

using namespace std;

 

class Animal{

       string name;//指针,占用四个字节

public:

 

//virtual   void eat(){//不管有多少个虚函数只需要一个指针,虚函数表

//            cout<<"动物吃食物"<<endl;

//     }

//virtual   void sleep(){//父类的虚函数可能不被执行。

//     cout<<"动物休息"<<endl;

//     }

//virtual   void shout(){

//     cout<<"动物叫"<<endl;

//     }

       virtual void eat()=0;// 表示这是一个肯定不会被真正执行的函数

       virtual void sleep()=0;//这便是纯虚函数

       virtual void shout()=0;//含有纯虚函数的类称为抽象类,不许之间创建抽象类的对象

       };

class Cat:public Animal{

public:

       void eat(){

              cout<<"猫吃猫粮"<<endl;

       }

       void sleep(){

              cout<<"猫在床上睡觉"<<endl;

       }

       void shout(){

       cout<<"猫喵喵的叫"<<endl;

       }

};

class Dog:public Animal{

public:

       void eat(){

       cout<<"狗啃骨头"<<endl;

       }

       void sleep(){

       cout<<"狗仔狗窝里睡觉"<<endl;

       }

       void shout(){

              cout<<"我叫旺财"<<endl;

       }

};

class JiaFei:public Cat{

       void eat(){

              cout<<"加菲爱吃意大利面"<<endl;

       }

       void sleep(){

              cout<<"加菲睡在沙发上"<<endl;

       }

       void shout(){

              cout<<"加菲说hello"<<endl;

       }

};

class Player{

       string name;

public:

       Player(string n):name(n){}

       void play(Animal* p){//指针或者引用

              cout<<name<<":"<<endl;

              p->eat();

              p->sleep();

              p->shout();

       }

       void play(Animal &p){

              cout<<name<<":"<<endl;

              p.eat();

              p.sleep();

              p.shout();

       }

 

};

int main()

{

       Cat c;

       Dog d;

       JiaFei e;

       Player p1("赵德奎");

       Player p2("谢元亮");

       p1.play(&c);

       p2.play(&d);

       p2.play(e);

      

}*/

/*

#include<iostream>

using namespace std;

class A{

const int data;

public:

       A(int d=0):data(d){}

       virtual void show() const{

              cout<<"data="<<data<<endl;

       }

       void set(int d){

              const_cast<int&>(data)=d;//常量转换成变量

       }

};

class B:public A{

public:

       void sayhello(){

              cout<<"welcome to beijing"<<endl;

       }

};

int main()

{

       static_cast<A>(100).show();

       A(100).show();

       A obj(200);

       obj.show();

       obj.set(300);

       obj.show();

       int n=1;//同样一个1在不同计算机中可能有不同的保存格式。

       typedef unsigned int UI;//起别名

       typedef unsigned char UC;

       UC* p=NULL;

       p=reinterpret_cast<UC*>(&n);

       for(int i=0;i<4;i++)

       {

              cout<<int (*p++)<<" ";

              cout<<endl;

       }

       A oa;

       B ob;

       A* pa=&oa;

       B* pb=NULL;

       pb=dynamic_cast<B*>(pa);

       cout<<"pb="<<pb<<endl;

       pa=&ob;

       pb=dynamic_cast<B*>(pa);

       cout<<"pb="<<pb<<endl;

 

      

}

*/

/*

#include<iostream>

using namespace std;

 

class A{

public:

       A(){cout<<"A()"<<endl;

       }

virtual     ~A(){cout<<"~A()"<<endl;//调用子类真实的析构函数,采用虚函数

       }

 

};

class B:public A{

public:

       B(){

              cout<<"B()"<<endl;

       }

       ~B(){

       cout<<"~B()"<<endl;

       }

};

int main()

{

       A* p=new B;

       delete p;

 

}

*/

//作业: 设计一个程序,有一个汽车类vehicle,它具有igexuyao传递参数的构造函数

//类中的数据成员抱够:车轮个数,wheels和车重weight作为保护成员,:

//小车类car是他的派生类,其中包括载人数passengers,

//卡车类truck是vehicle的派生类,其中包括载人数passengers和载重量payload,

//每个类都具有相关数据的输出方法

 

/*

#include<iostream>

using namespace std;

 

class Vehicle{

protected:

       int wheels;

       double weight;

public:

       Vehicle(int wheels=0,double weight=0):wheels(wheels),weight(weight){}

       virtual void show(){

              cout<<"车有"<<wheels<<"个轮子,重"<<weight<<"吨"<<endl;

       }

};

class Car:public Vehicle{

       int passenger;

public:

       Car(int passenger,int wheels, double weight):passenger(passenger),Vehicle(wheels,weight){}

       void show(){

              cout<< "车能载"<<passenger<<"名乘客,";

              Vehicle::show();

       }

};

       class Truck:public Car{

       int passenger;

       double payload;

       public:

              Truck(double payload,int passenger,int wheels, double weight):payload(payload),Car(passenger,wheels, weight){}

              void show(){

                     cout<<"车载重:"<<payload<<',';

                     Car::show();

              }

      

      

       }; 

 

 

int main()

{

       Vehicle a(4,20.5);

       a.show();

       Car b(5,4,20);

       b.show();

       Truck c(45,2,6,20);

       c.show();

}

/*

#include<iostream>

using namespace std;

 

class A{

int data;

public:

       A(int d=0):data(d){

       }

       void show(){

       cout<<"data="<<data<<endl;

       }

       friend A add(const A& a1,const A& a2);//授权,声明在类的内部声明,声明可以和定义写在一起。

    friend class B;

 

};

class B{

       //double data;

public:

       A tiwce(A& a){

              a.data*=2;

              return a.data;

       }

};

A add(const A& a1,const A& a2){//友元不是成员,其中没有this。没有当前对象

       int sum=a1.data+a2.data;//一般用引用而不是复制一份。

       return A(sum);

}

 

 int main()

 {

        A a1(40),a2(50);

        add(a1,a2).show();

        B b;

        b.tiwce(a1).show();

 

 }

*/

 

/*

#include<iostream>

#include<string>

using namespace std;

 

class Sd0705{

 public:

        string name;

        static string teacher;

        static int room;

        Sd0705(const string &n):name(n){}

        void show(){

     cout<<"我是:"<<name<<",在"<<room<<"教室听"<<teacher<<"讲课"<<endl;

        }

        static void newteacher(const string& t){

               teacher=t;

        }

 

 

};

string Sd0705::teacher="陈宗权";

int Sd0705::room=712;

int main()

{

       Sd0705 s1("伯乐");

       Sd0705  s2( "阜新");

       Sd0705 s3("马杰");

       s1.show();

       s2.show();

       s3.show();

       Sd0705::newteacher( "谢元亮");

       s1.show();

       s2.show();

       s3.show();

}

*/

//  多态,继承,虚函数,指针和引用,类型转换,纯虚函数

//  友元friend来声明,静态成员static,在类的外面声明,类名::成员,友元和静态都没有this 没有当前对象

//运算符重载

 

/*

#include<iostream>

using namespace std;

 

class A{

int data;

public:

       A(int d=0):data(d){

       cout<<"A(int =0)"<<endl;

       }

       ~A(){

              cout<<"data=90"<<endl;

       }

       A(const A& obj){//拷贝构造函数,有特殊的名字, 与其他的普通构造函数无区别

              cout<<"A(const A&)"<<endl;// 有多个构造函数的时候, 调用哪一个构造函数完全有参数决定

       }

       void show(){

       cout<<"data1="<<data<<endl;

       }

       friend A add(const A a1,const A a2);//授权,声明在类的内部声明,声明可以和定义写在一起。

    friend class B;

 

};

class B{

       //double data;

public:

       A tiwce(A  a){

              a.data*=2;

              return a.data;

       }

};

A add(const A a1,const A a2){//友元不是成员,其中没有this。没有当前对象

       int sum=a1.data+a2.data;//一般用引用而不是复制一份。

       return A(sum);//初始化:A a1=obj1;  A  a2(obj2);

}

 

 int main()

 {

        A a1(40),a2(50);

        add(a1,a2).show();

        

 }

 

 

/*

#include<iostream>

using namespace std;

 

class A{

 

 

       int data;

public:

       A():data(100){

              cout<<"A()"<<endl;

       }

       A(int d):data(d)

       {

              cout<<"A(int)"<<endl;

       }

       A(bool b):data(b?123:456){

              cout<<"a(bool)"<<endl;

       }

       A(char c):data((int )c){

              cout<<"A(char)"<<endl;

       }

       A(const A& o):data(o.data){

              cout<<"A(const A&)"<<endl;

       }

       void show(){

              cout<<"data="<<data<<endl;

       }

       virtual ~A(){

              cout<<"~A()"<<endl;

       }

      

};

 

int main()

{

       A a1;

       A a2(4);

       A a3(false);

       A a4('a');

       A a5( a2);

}

*/

/*

 

#include<iostream>

using namespace std;

 

 

class Array{

     char *p;

        int len;

public:

        Array(int n):len(0),p(NULL){

               resize(n);

        }

        void resize (int n){

              char* q=new char[n]; //申请空间、

              int min=(n<len?n:len);

              if(p!=NULL){

                     for(int i=0;i<min;++i)

                            q[i]=p[i];

                     delete[] p;//释放原来的空间。

              }

                     p=q;

                     for(int j=min;j<n;++j)

                            p[j]='\0';

                      len=n;//那里调用的函数,函数执行完毕后返回到调用函数的语句。

        }

 

        void set(int  index, char value){

               if(index<0||index>len){

                      cout<<"EERROR"<<index<<"溢出";

               }

               p[index]=value;

        }

        char get(int index){

               return p[index];

        }

 

        int size(){

               return len;

        }

 

        ~Array(){

               if(p!=NULL){

               delete[] p;

               p=NULL;

               }

        }

 

};

 

int main()

{

       Array a1(100);

       cout<<"input chars(end by '$'):";

       for(int i=0;;++i)

       {

              char ch;

              cin>>ch;

              if(ch=='$')

                     break;

              else  if(i+1>a1.size())

                 a1.resize(i+10);

                 a1.set(i,ch);

       }

       for(int j=0;j<a1.size();++j)

              cout<<a1.get(j);

           cout<<endl;

 

 

              Array a2(20);

 

}

*/

 

/*

#include<iostream>

using namespace std;

 

class Array{

     char *p;

        int len;

public:

       //默认构造函数的工作是将a2(a1),a1中的内容按字节复制到a2中。

       Array(const Array& o):len(o.len)

       {// 深拷贝,即自己写构造函数

              p=new char[len];

              for(int i=0;i<len;i++)

                     p[i]=o.p[i];

       }

 

 

       Array(int n):len(n),p(new char[]){}

        int size()

        {

               return len;

        }

 

        ~Array(){

               

               delete[] p;

        }

        void fill(char start,int skip)

        {

               for(int i=0;i<len;++i)

                 p[i]=start+skip*i;

        }

        void show()

        {

               for(int j=0;j<len;++j)

               cout<<p[j];

               cout<<endl;

        }

};

 

int main()

{

 

       Array a1(10);

       a1.fill('a',1);

       a1.show();

       Array a2(a1);

       a2.fill('A',1);

       a2.show();

       a1.show();

}*/

/*

posted @ 2013-03-08 14:04  ReaLo  阅读(239)  评论(0编辑  收藏  举报