虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针引用来访问基类和派生类中的同名函数。
#include<iostream>
using namespace std;
class Student
{
public:
Student(int,string,float);
virtual void display();//virtual 声明为虚函数
protected:
int num;
string name;
float score;
};
//Student类成员函数的实现
Student::Student(int n,string nam,float s)
{
num=n;name=nam;score=s;
};
void Student::display()
{
cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<"\n\n"<<endl;
}
//声明公用派生类Graduate
class Graduate:public Student
{
public:
Graduate(int,string,float,float);
void display();
private:
float wage;
};
Graduate::Graduate(int n,string nam,float s,float w):Student(n,nam,s),wage(w){}
void Graduate::display()
{
cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<"\nwage"<<wage<<endl;
}
int main()
{
Student stud1(1001,"Li",87.5);
Graduate grad1(2001,"Wang",98.5,1200);
Student *pt=&stud1;
pt->display();
pt=&grad1;
pt->display();
return 0;
}
#include<iostream>
using namespace std;
//声明抽象基类Shape
class Shape
{
public:
virtual float area()const {return 0.0;}
virtual float volume()const {return 0.0;}
virtual void shapeName() const=0; //纯虚函数
/*由于考虑到在Point类中不再对area和volume函数进行重新定义,因此没有吧area和volume也声明为纯虚函数*/
};
class Point:public Shape
{
public:
Point(float x=0,float y=0); //声明构造函数
void setPoint(float,float);
float getX() const {return x;}
float getY() const {return y;}
virtual void shapeName() const {cout<<"Point:";} //对纯虚函数进行再定义
friend ostream & operator<<(ostream &,const Point &); //运算符重载
protected:
float x,y;
};
Point::Point(float a,float b)
{
x=a;y=b;
}
void Point::setPoint(float a, float b)
{
x=a;y=b;
}
ostream &operator <<(ostream &output,const Point &p)
{
output<<"{"<<p.x<<","<<p.y<<"]";
return output;
}
class Circle:public Point
{
public:
Circle(float x=0,float y=0,float r=0);
void setRadius(float );
float getRadius()const ;
virtual float area() const;
virtual void shapeName() const{cout<<"Circle:";}
friend ostream & operator<<(ostream &output,const Circle &);
protected:
float radius;
};
Circle::Circle(float a,float b,float r):Point(a,b),radius(r){}
void Circle::setRadius(float r){radius=r;}
float Circle::getRadius()const {return radius;}
float Circle::area() const {return 3.14159*radius*radius; }
ostream &operator <<(ostream &output,const Circle &c)
{
output<<"["<<c.x<<","<<c.y<<"],r="<<c.radius;
return output;
}
class Cylinder:public Circle
{
public:
Cylinder(float x=0,float y=0,float r=0,float h=0);//声明构造函数
void setHeight(float);
virtual float area() const;
virtual float volume() const;
virtual void shapeName() const{cout<<"Cylinder";}
friend ostream &operator <<(ostream &,const Cylinder &);
protected:
float height;
};
Cylinder::Cylinder(float x, float y, float r, float h):Circle(x,y,r),height(h) { }
void Cylinder::setHeight(float h) {height=h; }
float Cylinder::area() const
{
return 2*Circle::area()+2*3.1415926*radius*height;
}
float Cylinder::volume() const
{
return Circle::area()*height;
}
ostream &operator <<(ostream &output,const Cylinder &cy)
{
output<<"["<<cy.x<<","<<cy.y<<"],r="<<cy.radius<<",h="<<cy.height;
return output;
}
int main()
{
Point point(3.2,4.5);
Circle circle(2.4,1.2,5.6);
Cylinder cylinder(3.5,6.4,5.2,10.5);
point.shapeName(); //用对象名建立静态关联
cout<<point<<endl;
circle.shapeName();
cout<<circle<<endl;
cylinder.shapeName();
cout<<cylinder<<endl;
Shape *pt; //定义基类指针
pt=&point; //是指针指向Point类对象
pt->shapeName(); //用指针建立动态关联
cout<<"x="<<point.getX()<<",y="<<point.getY()<<"\narea="<<pt->area()<<
"\nvolume="<<pt->volume()<<endl<<endl;
pt=&circle; //指针指向circle类对象
pt->shapeName(); //用指针建立动态关联
cout<<"x="<<circle.getX()<<",y="<<circle.getY()<<"\narea="<<pt->area()<<"\nvoluem="
<<pt->volume()<<endl<<endl;
pt=&cylinder;//指针指向cylinder类对象
pt->shapeName(); //用指针建立动态关联
cout<<"x="<<cylinder.getX()<<",y="<<cylinder.getY()<<"\narea="<<pt->area()<<"\nvoluem="
<<pt->volume()<<endl<<endl;
return 0;
}
“`