虚函数&纯虚函数

来源:互联网 发布:单片机编程软件是哪些 编辑:程序博客网 时间:2024/05/27 09:46

虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针引用来访问基类和派生类中的同名函数。

#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;}//声明公用派生类Graduateclass 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;//声明抽象基类Shapeclass 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;}

“`

0 0