清华大学C++程序设计(郑莉)实验八-多态性

例题一:运算法重载

!!重载++i,i++为成员函数。重载--i,i--,<<为非成员函数/友元函数
 

#include<iostream>
#include<string.h>
using namespace std;

class Point{
	int _x,_y;
	public:
		Point(int x=0,int y=0):_x(x),_y(y){		}
//类成员 
  //++i
 Point & operator ++(){
 	_x++;
	_y++;
	return *this; 
 }
  //i++
 Point operator ++(int){
 	Point t=*this;
 	++*this;
 	return t;
 }

//类非成员 
  //--i
  friend  Point & operator --(Point &p);
  //i--	
  friend  Point  operator --(Point &p,int);	
  
  friend  ostream & operator<<(ostream &qq,const Point &p); //<<>>不能是成员 
};
//--i
Point & operator --(Point &p){
	p._x--;
	p._y--;
	return p;
}

//i--
Point operator --(Point &p,int){
Point t=p;
	--p;
	return t;
}

 ostream & operator<<(ostream &qq,const Point &p){
 	cout<<"("<<p._x<<" , "<<p._y<<")"<<endl;
	 return qq;
 }
int main(){
Point p1(1,2);
p1++;
cout<<p1;
p1--;
p1--;
cout<<p1;
	return 0;
}

例题二:虚函数

虚基类——解决继承的二义性问题:

基类A;B、C 继承A;D继承BC:   必须虚基类,BC必须virtual继承,否则报错。

虚函数 ——基类指针取派生类函数:

在虚基类基础之上,A *p= new A/B/C/D; 基类的指针可以指向派生类对象,只能取到基类函数;

p -> run()只能取到A.run( );

run( )改为虚函数时,基类指针=&派生类对象,可以取到派生类函数


#include<iostream>
#include<string.h>
using namespace std;

class vehicle{
int speed; 
	public:
	  void Run(){ cout<<"vehicle run"<<endl;	}
	  void Stop(){ cout<<"vehicle Stop"<<endl;}
};

class bicycle:virtual public vehicle{
int height;
	public:
	  void Run(){ cout<<"bicycle run"<<endl;	}
	  void Stop(){ cout<<"bicycle Stop"<<endl;}
};

class motorcar:virtual public vehicle{
	int seatnum;
	public:
	   void Run(){ cout<<"motorcar run"<<endl;	}
	   void Stop(){ cout<<"motorcar Stop"<<endl;}
};

class motorcycle:public motorcar,public bicycle{
	public:
	 void Run(){ cout<<"motorcycle run"<<endl;	}
	void Stop(){ cout<<"motorcycle Stop"<<endl;}
};


int main(){
 vehicle v;
 v.Run();
 v.Stop();
 bicycle b;
 b.Run();
 b.Stop();
 motorcar m;
 m.Run();
 m.Stop();
 motorcycle mb;
 mb.Run();
 mb.Stop();
  vehicle *p=&v;
  p->Run();
  p->Stop();
  p=&b;
  p->Run();
  p->Stop();
  p=&m;
  p->Run();
  p->Stop();
  p=&mb;
  p->Run();
  p->Stop();
	return 0;
}

拓展练习:

#include<iostream>
#include<string.h>
using namespace std;
class day{	
	int y,m,d;
	public:
	day(int yy=0,int mm=0,int dd=0):y(yy),m(mm),d(dd){
	}
	void show(){
		cout<<y;
		if(m<10) cout<<0;
		cout<<m;
		if(d<10)cout<<0;
		cout<<d<<endl;
	}
	void setday(int yy,int mm,int dd){
		y=yy;
		m=mm;
		d=dd;
	}
	day & operator =(const day &da){
		y=da.y;
		m=da.m;
		d=da.d;
	}
};
class people{ 
	char name[11];
    char number[7];
    char sex[3];
	day birthday;//如950101
	char id[16];//18位 
 public:
 	people(){} //const char*
   people(const char* s,const char* n,const char* se,day b,const char* i):birthday(b){  
      strcpy(name, s); 
      strcpy(number, n);
      strcpy(sex, se);
      strcpy(id, i);
    }
   people(const people &p):birthday(p.birthday){//类没重载“=”不能用= 
      strcpy(name, p.name); 
      strcpy(number,p.number);
      strcpy(sex, p.sex);
      strcpy(id,p.id);
		  }
   ~people(){   }
   void input(char* s,char* n,char* se,int y,int m,int d,char* i){
   	strcpy(name, s); 
      strcpy(number, n);
      strcpy(sex, se);
      strcpy(id, i);
	  birthday.setday(y,m,d);
	  }
   void show(){            //隐示内联成员函数 
   
        cout<<"people-name:"<<name<<endl;
	    cout<<"number:"<<number<<endl;
	    cout<<"sex:"<<sex<<endl;
	    cout<<"birthday:";
        birthday.show();
        cout<<"id:"<<id[0]<<endl;
        return;
   }
 
 //p  ==p2
  bool operator ==(const people &p);
 //p = p2  =c=d
   people & operator =(const people&p);
};

 //p  ==p2  判断char id[18] 
  bool people::operator ==(const people &p){
  	    for(int i=0;p.id[i]!='\0';++i){
  	    	if(this->id[i]!=p.id[i])
  	    	   return 0;
		  }
		  return 1;
  }
 //p = p2  =c=d
   people & people::operator =(const people&p){
   	   strcpy(name, p.name); 
      strcpy(number,p.number);
      strcpy(sex, p.sex);
      strcpy(id,p.id);
      this->birthday=p.birthday;
  }

 class student:virtual public people{
 	char classNO[7]; //班号 
 	public:
 	 student(){		 }
	 student(const people &p,const char* cn):people(p){  //const 类名&p 访问类对象,快 
	     strcpy(this->classNO, cn);  }
	 void input( char* cn){strcpy(this->classNO, cn);}
	 void show(){ 
	   cout<<"学生:"<<endl; 
	   people::show(); //派生类用基类名访问基类方法 
	   cout<<"classNO: "<<classNO<<endl;
	   }
 };
  class teacher:virtual public people{
 	char principalship[11];//职务 
 	char department[21];//科目 
 	public:
 		teacher(){}
 		teacher(const people &p, const char* pp, const char * de):people(p){ strcpy(this->principalship,pp);strcpy(this->department,de);}
 		void input( const char* pp,const  char * de){strcpy(this->principalship,pp);strcpy(this->department,de);}
	    void show(){ cout<<"老师: "<<endl;
		             people::show();
		             cout<<"职务: "<<principalship<<endl;
		             cout<<"部门: "<<department<<endl;
		             return;
					 }
 };
  class graduate:virtual public student{
 	char subject[21];//科目 
 	teacher adviser; //导师 
 	public:
 		graduate(){		 }
 		graduate(const student &st,const char* s,teacher a):people(st),student(st),adviser(a){	strcpy(this->subject,s);	 }
    	void input( char* s,char* pp, char * de){strcpy(this->subject,s); adviser.input(pp,de);}
	    void show(){ 
		
		student::show();
		cout<<"科目 : "<<subject<<endl;
		cout<<"导师"<<endl; 
		adviser.show(); 
		 }
 };
 class TA:public graduate,public teacher{
 	public:
 		TA(){		 }
 		TA(const graduate &g,const teacher &t):people(g),graduate(g),teacher(t){		 } //people
 		void show(){
 			graduate::show();
		 }
 };
 
int main(){  
   day d(00,01,01);
   people p1("xiaomin","001","0",d,"12345678");
   p1.show();
   people p2=p1;
   p2.show();
   people p3("xiaomin","001","0",d,"12345699");
   if(p1==p2) cout<<"p1=p2"<<endl;
   if(p1==p3) cout<<"p1=p3"<<endl;
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值