Base class
Port.h
#ifndef PORT_H
#define PORT_H
#include<iostream>
class Port
{
private:
char* brand;
char style[20];
int bottles;
public:
Port(const char* br = "none", const char* st = "none", int b = 0);
Port(const Port& p);
virtual ~Port() { delete[] brand; }
Port& operator=(const Port& p);
Port& operator+=(int b);
Port& operator-=(int b);
int BottleCount()const { return bottles; }
virtual void Show()const;
friend std::ostream& operator<<(std::ostream& os, const Port& p);
};
#endif // !PORT_H
Prot.cpp
#include<cstring>
#include "Port.h"
using std::cout;
using std::endl;
using std::strlen;
using std::strcpy;
using std::strncpy;
Port::Port(const char* br, const char* st, int b)
{
brand = new char[strlen(br) + 1];
strcpy(brand, br);
strncpy(style, st, 19);
style[19] = '\0';
bottles = b;
}
Port::Port(const Port& p)
{
brand = new char[strlen(p.brand) + 1];
strcpy(brand, p.brand);
strcpy(style, p.style);
bottles = p.bottles;
}
Port& Port::operator=(const Port& p)
{
if (this == &p)
{
return *this;
}
delete[] brand;
brand = new char[strlen(p.brand) + 1];
strcpy(brand, p.brand);
strcpy(style, p.style);
bottles = p.bottles;
return *this;
}
Port& Port::operator+=(int b)
{
bottles += b;
return *this;
}
Port& Port::operator-=(int b)
{
if (bottles < b)
{
cout << "Not available\n";
}
else
{
bottles -= b;
}
return *this;
}
void Port::Show()const
{
cout << "Brand: " << brand << endl;
cout << "Kind: " << style << endl;
cout << "Bottles: " << bottles << endl;
}
std::ostream& operator<<(std::ostream& os, const Port& p)
{
os << p.brand << ", " << p.style << ", " << p.bottles << endl;
return os;
}
Derived class
VintagePort.h
#ifndef VINTAGEPORT_H
#define VINTAGEPORT_H
#include<iostream>
#include "Port.h"
class VintagePort :
public Port
{
private:
char* nickname;
int year;
public:
VintagePort();
VintagePort(const char* br, const char* st, int b, const char* nn, int y);
VintagePort(const VintagePort& vp);
~VintagePort() { delete[] nickname; }
VintagePort& operator=(const VintagePort& vp);
void Show()const;
friend std::ostream& operator<<(std::ostream& os, const VintagePort& vp);
};
#endif // !VINTAGEPORT_H
VintagePort.cpp
#include<cstring>
#include "VintagePort.h"
using std::cout;
using std::endl;
using std::strlen;
using std::strcpy;
using std::strncpy;
VintagePort::VintagePort()
{
nickname = new char[5];
strcpy(nickname, "none");
year = 0;
}
VintagePort::VintagePort(const char* br, const char* st, int b, const char* nn, int y)
: Port(br, st, b)
{
nickname = new char[strlen(nn) + 1];
strcpy(nickname, nn);
year = y;
}
VintagePort::VintagePort(const VintagePort& vp)
: Port(vp)
{
nickname = new char[strlen(vp.nickname) + 1];
strcpy(nickname, vp.nickname);
year = vp.year;
}
VintagePort& VintagePort::operator=(const VintagePort& vp)
{
if (this == &vp)
{
return *this;
}
Port::operator=(vp);
delete[] nickname;
nickname = new char[strlen(vp.nickname) + 1];
strcpy(nickname, vp.nickname);
year = vp.year;
return *this;
}
void VintagePort::Show()const
{
Port::Show();
cout << "Nickname: " << nickname << endl;
cout << "Year: " << year << endl;
}
std::ostream& operator<<(std::ostream& os, const VintagePort& vp)
{
os << (const Port&)vp;
os << vp.nickname << ", " << vp.year << endl;
return os;
}