#include <iostream>
#include <cstring>
using namespace std;
class Port{
private:
char* brand;
char style[20];
int bottles;
public:
Port(const char* br="none", const char*st="none", int b=0){
brand = new char[strlen(br)+1];
strcpy(brand,br);
strcpy(style,st);
bottles = b;
}
Port(const Port&p){
brand = new char[strlen(p.brand)+1];
strcpy(brand, p.brand);
strcpy(style, p.style);
bottles = p.bottles;
}
virtual ~Port(){delete[] brand;}
Port& operator=(const Port&p){
if(&p==this)
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& operator+=(int b){
bottles += b;
return *this;
}
Port& operator-=(int b){
bottles -= b;
bottles = bottles>0?bottles:0;
return *this;
}
int BottleConut() const{return bottles;}
virtual void show() const{
cout<<"Brand: "<<brand<<endl<<"Kind: "<<style<<endl<<"Bottles: "<<bottles<<endl;
}
friend ostream& operator<<(ostream&os, const Port&p){
os<<p.brand<<", "<<p.style<<", "<<p.bottles;
return os;
}
};
class VintagePort: public Port{
private:
char* nickname;
int year;
public:
VintagePort():Port("none","vintage",0),year(0) //可使用初始化列表
{
nickname = new char[strlen("none")+1];
strcpy(nickname, "none");
}
VintagePort(const char* br, int b, const char *nn, int y){
Port::Port(br,"vintage",b); // 构造函数的重写方式
nickname = new char[strlen(nn)+1];
strcpy(nickname, nn);
year = y;
}
VintagePort(const VintagePort& vp):Port(vp){
nickname = new char[strlen(vp.nickname)+1];
strcpy(nickname, vp.nickname);
year = vp.year;
}
~VintagePort(){delete[] nickname;}
VintagePort& operator=(const VintagePort&vp){
if(&vp==this)
return *this;
delete[] nickname;
Port::operator=(vp); // 赋值=的重写方式
nickname = new char[strlen(vp.nickname)+1];
strcpy(nickname, vp.nickname);
year = vp.year;
return *this;
}
virtual void show() const{
Port::show(); // 虚函数重写,需要调用基本虚函数时
cout<<"Nickname: "<<nickname<<endl<<"Year: "<<year<<endl;
}
friend ostream& operator<<(ostream&os, const VintagePort&vp){
os<<(const Port&)vp; // 友元函数的重写方式
os<<", "<<vp.nickname<<", "<<vp.year;
return os;
}
};
c++ 子类虚函数、友元函数、复构、构造、赋值=的重写方式 - 练习题
最新推荐文章于 2021-04-13 11:51:43 发布