例题一:运算法重载
!!重载++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;
}