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();
}*/
/*