纯虚函数

#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
}
*/

/**/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值