#include<iostream.h>//纯虚函数
class shape{
public:
virtual double area()=0;
};
double total( shape *s[],int n);
double total( shape *s[],int n)
{
double sum=0;
for(int i=0;i<n;i++)
sum+=s[i]->area();
return sum;
}
class triangle:public shape{
protected:
double H,W;
public:
triangle(float h,float w){H=h;W=w;}
double area(){return H*W*0.5;}
};
class rectangle:public triangle{
public:
rectangle(float h,float w):triangle(h,w){}
double area(){return H*W;}
};
class circle:public shape{
private:
float radius;
public:
circle (float r){radius=r;}
double area(){ return radius*radius*3.14;}//类型必须和纯虚函数相同
};
void main()
{
shape *s[4];
s[0]=new triangle(3.0,4.0);
s[1]=new rectangle(2.0,4.0);
s[2]=new circle(5.0);
s[3]=new circle(8.0);
double sum=total(s,4);
cout<<sum<<"/n";
}
/*在许多情况下。在基类中不能为虚函数给出一个有意义的定义,这时可以将它说明为纯虚函数
它的定义留给派生类,纯虚函数的一般形式为
class 类名{
virtual 类型 函数名(参数列表)=0;
};
#include<iostream.h>
class number{
protected:
int val;
public:
number(int i){val=i;}
virtual void show()=0;
};
class hextype:public number{
public:
hextype (int i):number(i){}
void show() {cout<<hex<<val<<endl;}
};
class dectype:public number{
public:
dectype(int i):number(i){}
void show(){cout<<dec<<val<<endl;}
};
void main()
{
dectype d(50);
d.show();
hextype h(16);
h.show();
}
该例中,number类中的虚函数show()仅起到为派生类提供一个一致的接口的作用,
派生类中重定义的show()用于决定以什么样的方式(十进制或者十六进制)显示
由于在number类中不能对此作出决定,因此说明为纯虚函数
*/
/*
一个类可以说明多个纯虚函数,包含有纯虚函数的类为抽象类,一个抽象类只能作为
基类来派生新类,不能说明抽象类的对象,例如:
number n;//error
但可以说明指向抽象类对象的指针(和引用).例如:
number *pn;//ok
从一个抽象类派生的类必须提供纯虚函数的实现代码,或在改派生类中仍将它说明为纯虚函数,
否则编译器将给出错误信息。例如:
class smallnumber :public number{
void show()=0;
}
说明纯虚函数的派生类仍是抽象类。如果派生类中给出了基类所有纯虚函数的实现,则该派生类不再是抽象类
*/
/*
在成员函数中可以调用纯虚函数,但在构造函数或析构函数内调用一个纯虚函数将导致程序运行错误,
因为没有为纯虚函数定义代码。例如:
class A{
public:
virtual void f()=0;
void g(){f();}//ok
A(){f();}//errror
}
*/
/**/
#include<iostream.h>//纯虚函数
class shape{
public:
virtual double area()=0;
};
double total( shape *s[],int n);
double total( shape *s[],int n)
{
double sum=0;
for(int i=0;i<n;i++)
sum+=s[i]->area();
return sum;
}
class triangle:public shape{
protected:
double H,W;
public:
triangle(float h,float w){H=h;W=w;}
double area(){return H*W*0.5;}
};
class rectangle:public triangle{
public:
rectangle(float h,float w):triangle(h,w){}
double area(){return H*W;}
};
class circle:public shape{
private:
float radius;
public:
circle (float r){radius=r;}
double area(){ return radius*radius*3.14;}//类型必须和纯虚函数相同
};
void main()
{
shape *s[4];
s[0]=new triangle(3.0,4.0);
s[1]=new rectangle(2.0,4.0);
s[2]=new circle(5.0);
s[3]=new circle(8.0);
double sum=total(s,4);
cout<<sum<<"/n";
}
/*在许多情况下。在基类中不能为虚函数给出一个有意义的定义,这时可以将它说明为纯虚函数
它的定义留给派生类,纯虚函数的一般形式为
class 类名{
virtual 类型 函数名(参数列表)=0;
};
#include<iostream.h>
class number{
protected:
int val;
public:
number(int i){val=i;}
virtual void show()=0;
};
class hextype:public number{
public:
hextype (int i):number(i){}
void show() {cout<<hex<<val<<endl;}
};
class dectype:public number{
public:
dectype(int i):number(i){}
void show(){cout<<dec<<val<<endl;}
};
void main()
{
dectype d(50);
d.show();
hextype h(16);
h.show();
}
该例中,number类中的虚函数show()仅起到为派生类提供一个一致的接口的作用,
派生类中重定义的show()用于决定以什么样的方式(十进制或者十六进制)显示
由于在number类中不能对此作出决定,因此说明为纯虚函数
*/
/*
一个类可以说明多个纯虚函数,包含有纯虚函数的类为抽象类,一个抽象类只能作为
基类来派生新类,不能说明抽象类的对象,例如:
number n;//error
但可以说明指向抽象类对象的指针(和引用).例如:
number *pn;//ok
从一个抽象类派生的类必须提供纯虚函数的实现代码,或在改派生类中仍将它说明为纯虚函数,
否则编译器将给出错误信息。例如:
class smallnumber :public number{
void show()=0;
}
说明纯虚函数的派生类仍是抽象类。如果派生类中给出了基类所有纯虚函数的实现,则该派生类不再是抽象类
*/
/*
在成员函数中可以调用纯虚函数,但在构造函数或析构函数内调用一个纯虚函数将导致程序运行错误,
因为没有为纯虚函数定义代码。例如:
class A{
public:
virtual void f()=0;
void g(){f();}//ok
A(){f();}//errror
}
*/
/**/