抽象类

255阅读 0评论2010-01-15 welld_djj
分类:

//类中有纯虚函数的类就是抽象类

//该类不能建立实例对象,只能使用指针或者引用

//子类要实现父类的纯虚函数,否则子类也是抽象类

 

#include <iostream>

using namespace std;

class Shape
{
public:
    Shape(){}
    virtual ~Shape(){}
    virtual long GetArea()=0;
    virtual long GetPerim()=0;
    virtual void Draw()=0;
private:
};
//抽象类其实是可以实现的
void Shape::Draw()
{
    cout<<"Abstract drawing mechanism! \n";
}
//
class Circle:public Shape
{
public:
    Circle(int radius):itsRadius(radius){}
    ~Circle(){}
    long GetArea(){return 3.14*itsRadius*itsRadius;}
    long GetPerim(){return 2*3.14*itsRadius;}
    void Draw();
private:
    int itsRadius;
    int itsCircumference;
};

void Circle::Draw()
{
    cout<<"Circle Draw here\n";
    Shape::Draw();//这里能用this->Draw()么?
}

class Rectangle:public Shape
{
public:
    Rectangle(int len,int width):itsLength(len),itsWidth(width){}
    virtual ~Rectangle(){}
    long GetArea(){return itsLength*itsWidth;}
    long GetPerim(){return 2*itsLength+2*itsWidth;}
    virtual int GetLength() {return itsLength;}
    virtual int GetWidth() {return itsWidth;}
    void Draw();
private:
    int itsWidth;
    int itsLength;
};

void Rectangle::Draw()
{
    for(int i=0;i<itsLength;i++)
    {
        for(int j=0;j<itsWidth;j++)
        {
            cout<<"x";
        }
        cout<<"\n";
    }
    Shape::Draw();
}

class Square:public Rectangle
{
public:
    Square(int len);
    Square(int len,int width);
    virtual ~Square(){}
    long GetPerim() {return 4*GetLength();}
};

Square::Square(int len):Rectangle(len,len)
{

}

Square::Square(int len,int width):Rectangle(len,width)
{
    if(GetLength()!=GetWidth())
    cout<<"Error,not a square...a Rectangle??";
}

int main()
{
    int choice;
    bool fQuit=false;
    Shape *sp;
    
    while(fQuit==false)
    {
        cout<<"(1)Circle (2)Rectangle (3)Square (0)Quit:";
        cin >>choice;
        
        switch(choice)
        {
            case 1:sp=new Circle(5);
                break;
            case 2:sp=new Rectangle(4,6);
                break;
            case 3:sp=new Square(5);
                break;
            default:fQuit=true;
                break;
        }
        
        if(fQuit==false)
        {
            sp->Draw();
            delete sp;
            cout<<endl;
        }
    }
    return 0;
}


上一篇:多继承
下一篇:VSS的使用(转)