C++的接口和重载<<运算符的小例子(试试把Circle的类的virtual的shapeName函数注释掉? )


C++代码  参考谭浩强C++ 12章的12.4.3应用实例
//
//  Shape.h
//  Shape
//
//  Created by mac on 12-10-22.
//  Copyright (c) 2012年 Roc. All rights reserved.
//

#ifndef Shape_Shape_h
#define Shape_Shape_h
#include<iostream>
using namespace std;

class Shape {//这就是C++的接口
public:
    virtual float area() const {return 0.0;}//输出一个图形的面积
    virtual float volume() const {return 0.0;}//输出一个图形的体积
    virtual void  shapeName () const = 0;//纯虚函数,打出自己的数据的接口
    
    virtual ~Shape(){};
};



class Point: public Shape{

public:
    Point(float _x=0,float _y=0):x(_x),y(_y){}
    void setPoint(float,float);
    float getX() const{return x;}
    float getY() const{return y;} 
    
    virtual void shapeName () const{
        cout<<"Point:"<<(*this);
    }
    
    friend ostream & operator << (ostream & , const Point &);//
    
    
protected:
    float x,y;

};


class  Circle: public Point{
public:
    Circle(float x=0.0,float y=0,float r=0):Point(x,y),radius(r){}
    void setRadius(float r){radius = r;}
    float getRadius() const{return radius;}
    
    //求圆的面积
    virtual float area() const{
        return 3.14159*radius*radius;
    }
    
    virtual void shapeName() const{
        cout<<"Circle:"<<(*this);
    }
    
    friend ostream & operator <<(ostream & ,const Circle &);//
protected:
    float radius;
    
};

ostream& operator << (ostream & ostream, const Point & p){
    ostream<<"["<<p.x<<","<<p.y<<"]"<<endl;
    return ostream;
}

ostream & operator << (ostream & ostream, const Circle & c){
    ostream<<"Center["<<c.x<<","<<c.y<<"],Radius:"<<c.radius<<endl;
    return ostream;
}

#endif

//
//  main.cpp
//  Shape
//
//  Created by mac on 12-10-22.
//  Copyright (c) 2012年 Roc. All rights reserved.
//

#include <iostream>
#include <iostream>
#include "Shape.h"

class TestShape{
public:
    static void  test1(){
        Point  point(3.2,4.5);
        Circle  circle(2.4,1.2,5.6);
//        point.shapeName();
//        circle.shapeName();
//        
        Shape * pt;
        pt=&point;
        pt->shapeName();
        
        pt=&circle;
        pt->shapeName();
        cout<<"circle area:"<<pt->area();
        
    }
    
    
};

int main(int argc, const char * argv[])
{
    TestShape::test1();
    return 0;
}

 
   

#include"iostream" using namespace std; class Shape { public: virtual float area()const { return 0.0; } virtual float volume()const { return 0.0; } virtual void shapeName()const = 0; }; class Point :public Shape { protected: float x, y; public: Point(float = 0, float = 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 &); }; 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) { 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 &, 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 a, float b, float r, float h): Circle(a, b, r), height(h) {} void Cylinder::setHeight(float h) { height = h; } float Cylinder :: area() const{return 2 * Circle::area() + 2 * 3.14159 * 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 << endl; Shape * pt; pt = &point; pt->shapeName(); cout << "x=" << point.getX() << ",y=" << point.getY() << "\narea=" << pt->area() << "\nvolume=" << pt->volume() << "\n\n"; pt = &circle; pt->shapeName(); cout << "x=" << circle.getX() << ",y=" << circle.getY() << "\narea=" << pt->area() << "\nvolume=" << pt->volume() << "\n\n"; pt=&cylinder; pt->shapeName(); cout << "x=" << cylinder.getX() << ",y=" << cylinder.getY() << "\narea=" << pt->area() << "\nvolume=" << pt->volume() << "\n\n"; return 0; }为什么第一个Point不能输出数据
05-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值