虚函数&纯虚函数

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

#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;
}

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值