#include<iostream>
#include<string>
using namespace std;

//Material class
class Material
{
public:
    Material(float);
    virtual float calcValue() const = 0;
protected:
    float unit;
};
Material::Material(float value)
:unit(value)
{}
float Material:: calcValue() const
{
    return unit;
}

class Weight:public Material
{
public:
    Weight(float);
    float calcValue() const;
};

Weight::Weight(float value)
:Material(value){}

float Weight::calcValue() const
{
    
    float val,del,total,baseCharge=100.0;
    if(unit>1000)
    {
        val=unit/1000;
        del=baseCharge+val*10;
    }
    total=unit*.50+del;
    return total;
}

class Volume:public Material
{
public:
    Volume(float);
    float calcValue() const;
};

Volume::Volume(float value):Material(value)
{
}

float Volume::calcValue() const
{
    return unit * .75;
}

class Quantity:public Material
{
public:
    Quantity(float);
    float calcValue() const;
};

Quantity::Quantity(float value)
:Material(value){}

float Quantity::calcValue() const
{
    if (unit >= 1 && unit <= 10)
    {
        return unit * 3.00;
    }
    
    if (unit >= 11 && unit <= 50)
    {
        return unit * 2.50;
    }
    
    if (unit >= 51)
    {
        return unit * 2.00;
    }
}

void printTotal(ostream &os, Material &val)
{
    os<<"total: "<<val.calcValue()<<endl;
    
}

int main(void)
{
    Weight w1(2345.00);
    Volume v1(6550.00);
    Quantity q1(343);
    
    cout<<"Cost of item with weight of 2345 lbs: ";
    printTotal(cout, w1);
    cout<<endl;
    cout<<"Cost of item with volume of 6550 cubic ft: ";
    printTotal(cout, v1);
    cout<<endl;
    cout<<"Cost of item with quantity of 343: ";
    printTotal(cout, q1);
    cout<<endl;
    system("PAUSE");
}