C++多态学习(三)—纯虚函数

版权声明:欢迎交流,本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42513339/article/details/81142942

纯虚函数格式: virtual void draw() =0;

纯虚函数没有实现体,含有纯虚函数的类,称为抽象基类,抽象基类不可以实例化(注意:这里是抽象基类,在多继承那里的虚继承才是虚基类

在java中被称作interface 接口(在java中抽象基类),作用是给族类提供接口

 

例子:

class Shape
{
    public:
        Shape(int xx,int yy)
            :_x(xx),_y(yy) {}
        virtual void draw()=0;
    protected:
        int _x,_y;
};
void Shape::draw()
{
    cout<<"draw from"<<"("<<_x<<","<<_y<<")"<<endl;
}
class Rect:public Shape
{
    public:
        Rect(int x,int y,int len,int wid)
            :Shape(x,y),_len(len),_wid(wid)
        {
        }
        virtual void draw()//覆写
        {
            cout<<"start from"<<"("<<_x<<","<<_y<<")";
            cout<<"  len="<<_len<<"  wid="<<_wid<<endl;
        }
    private:
        int _len,_wid;
};

class Circle:public Shape
{
    public:
        Circle(int x,int y ,int r)
            :Shape(x,y),_radius(r){}

        virtual void draw()//覆写
        {
            cout<<"start from"<<"("<<_x<<","<<_y<<")";
            cout<<"  radius="<<_radius<<endl;
        }
    private:
        int _radius;
};
int main()
{
    //Shape s(1,1);   //error 不可以实例化
    Circle c(1,2,3);
    Shape *ps=&c;  //子类可以实例化,只是父类不可以,提供一个接口
    ps->draw();

    Rect r(3,4,5,6);
    ps=&r;
    ps->draw();
    return 0;
}


 

小结:

1.含有纯虚函数的类,称为抽象基类,不可实例化。即不能创建对象,存在的意义就是被继承,提供族类的公共接口,java中称为interface。
2.纯虚函数只有声明,没有实现,被“初始化”为 0 。
3.如果一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数,派生类仍然为纯虚基类。

展开阅读全文

没有更多推荐了,返回首页