第十三章 类继承
来源:互联网 发布:建站软件排行 编辑:程序博客网 时间:2024/06/01 10:30
第十三章 类继承
第一题:以已有类,派生出一个新类,并用指定程序进行测试。
//fiel1 onehead.h#ifndef ONEHEAD_H_#define ONEHEAD_H_#include<string>#include<iostream>using std::cout;using std::endl;class Cd{//private:protected: char performers[50]; char label[20]; int selections; double playtime;public: Cd(){}; Cd(char *s1, char *s2, int n, double x); Cd(const Cd &d); virtual ~Cd(){}; virtual void Report()const; //virtual Cd & operator=(const Cd & d);};#endif
//file2 oneheadplus.h#ifndef ONEHEADPLUS_H_#define ONEHEADPLUS_H_#include"onehead.h"class Classic:public Cd{public: Classic(){}; Classic(char *s3, char *s1, char *s2, int n, double x); ~Classic(){}; void Report()const; virtual Classic & operator=(const Classic & d);private: char abstract[60];};#endif
//file3 onehead.cpp#include"onehead.h"Cd::Cd(char *s1, char *s2, int n, double x){ strncpy_s(performers, s1, 49); strncpy_s(label, s2,19 ); selections = n; playtime = x;}Cd::Cd(const Cd &d){ strcpy_s(performers, d.performers); strcpy_s(label, d.label); selections = d.selections; playtime = d.playtime;}void Cd::Report()const{ cout << "----CD Methord----" << endl; cout << "Performers: " << performers << endl; cout << "Label : " << label << endl; cout << "Slections : " << selections << endl; cout << "Play time : " << playtime << endl;}
//file4 oneheadplus.cpp#include"oneheadplus.h"Classic::Classic(char *s3, char *s1, char *s2, int n, double x) :Cd(s1, s2, n, x){ strncpy_s(abstract, s3, 59);}void Classic::Report()const{ cout << "----Classic Methord----" << endl; cout << "Abstract : " <<abstract << endl; cout << "Performers: " << performers << endl; cout << "Label : " << label << endl; cout << "Slections : " << selections << endl; cout << "Play time : " << playtime << endl;}Classic & Classic::operator=(const Classic & d){ if (this == & d) return *this; strcpy_s(abstract, d.abstract); strcpy_s(performers, d.performers); strcpy_s(label, d.label); selections = d.selections; playtime = d.playtime; return *this;}
//file5 one.cpp#include"oneheadplus.h"void Bravo(const Cd &disk);int main(){ Cd c1("Beatles", "Capitol", 14, 35.5); Classic c2 = Classic("Piano Sonata in B flat ,Fantasia in C", "Alfred Brendel" , "Philips", 2, 57.17); Cd *pcd = &c1; cout << "Using object directly: \n\n"; c1.Report(); c2.Report(); cout << "\n\nUsing type cd* pointer to object : \n\n"; pcd->Report(); pcd = &c2; pcd->Report(); cout << "\n\nCalling a function with a Cd reference argument: \n\n"; Bravo(c1); Bravo(c2); cout << "\n\nTesting assigment: \n\n"; Classic copy; copy = c2; copy.Report(); system("pause"); return 0;}void Bravo(const Cd&disk){ disk.Report();}
第二题:重写上一题,利用动态内存分配。
与第一题代码基本相同只有少部分修改。
//file1 onehead.h#ifndef ONEHEAD_H_#define ONEHEAD_H_#include<string>#include<iostream>using std::cout;using std::endl;class Cd{//private:protected: //char performers[50]; //char label[20]; char *performers; char *label; int selections; double playtime;public: Cd(){}; Cd(char *s1, char *s2, int n, double x); Cd(const Cd &d); virtual ~Cd(){}; virtual void Report()const;};#endif
//file2 oneheadplus.cpp#ifndef ONEHEADPLUS_H_#define ONEHEADPLUS_H_#include"onehead.h"class Classic:public Cd{public: Classic(){}; Classic(char *s3, char *s1, char *s2, int n, double x); ~Classic(){}; void Report()const; virtual Classic & operator=(const Classic & d);private: //char abstract[60]; char *abstract ;};#endif
//file3 onehead.cpp#include"onehead.h"Cd::Cd(char *s1, char *s2, int n, double x){ performers=s1; label=s2; //strncpy_s(performers, s1, 49); //strncpy_s(label, s2,19 ); selections = n; playtime = x;}Cd::Cd(const Cd &d){ performers = d.performers; label = d.label; //strcpy_s(performers, d.performers); //strcpy_s(label, d.label); selections = d.selections; playtime = d.playtime;}void Cd::Report()const{ cout << "----CD Methord----" << endl; cout << "Performers: " << performers << endl; cout << "Label : " << label << endl; cout << "Slections : " << selections << endl; cout << "Play time : " << playtime << endl;}
//file4 oneheadplus.cpp#include"oneheadplus.h"Classic::Classic(char *s3, char *s1, char *s2, int n, double x) :Cd(s1, s2, n, x){ abstract=s3; //strncpy_s(abstract, s3, 59);}void Classic::Report()const{ cout << "----Classic Methord----" << endl; cout << "Abstract : " <<abstract << endl; cout << "Performers: " << performers << endl; cout << "Label : " << label << endl; cout << "Slections : " << selections << endl; cout << "Play time : " << playtime << endl;}Classic & Classic::operator=(const Classic & d){ if (this == & d) return *this; abstract = d.abstract; performers = d.performers; label = d.label; //strcpy_s(abstract, d.abstract); //strcpy_s(performers, d.performers); //strcpy_s(label, d.label); selections = d.selections; playtime = d.playtime; return *this;}
//file5 one.cpp#include"oneheadplus.h"void Bravo(const Cd &disk);int main(){ Cd c1("Beatles", "Capitol", 14, 35.5); Classic c2 = Classic("Piano Sonata in B flat ,Fantasia in C", "Alfred Brendel" , "Philips", 2, 57.17); Cd *pcd = &c1; cout << "Using object directly: \n\n"; c1.Report(); c2.Report(); cout << "\n\nUsing type cd* pointer to object : \n\n"; pcd->Report(); pcd = &c2; pcd->Report(); cout << "\n\nCalling a function with a Cd reference argument: \n\n"; Bravo(c1); Bravo(c2); cout << "\n\nTesting assigment: \n\n"; Classic copy; copy = c2; copy.Report(); system("pause"); return 0;}void Bravo(const Cd&disk){ disk.Report();}
第三题:修改DMA的示例程序,使其中的三个类都由ABC类派生而来,并在定义中添加vitural View()方法处理数据显示
//file1 threehead.h#ifndef THREEHEAD_H_#define THREEHEAD_H_#include<iostream>using std::cout;using std::endl;using std::cin;class ABC{private: char *label; int rating;public: ABC(){}; ABC(char *l, int r) { label = l; rating = r; }; ABC(const ABC & D) { label = D.label; rating = D.rating; }; virtual ~ABC(){ }; virtual void View()const = 0;protected: char *la()const { return label; }; int ra()const { return rating; };};class DMA:public ABC{public: DMA(){}; DMA(const DMA & D) :ABC(D){}; DMA(char *l, int r) :ABC(l,r){}; virtual ~DMA(){}; virtual void View()const;};class LackDMA :public ABC{private: char color[40];public: LackDMA(){}; LackDMA(char *s, char *l, int r) :ABC(l, r) { strncpy_s(color, s, 39); color[39] = '\0'; } virtual ~LackDMA(){}; virtual void View()const;};class HasDMA :public ABC{private : char * style;public:public: HasDMA(){}; HasDMA(char *s, char *l, int r) : ABC(l, r) { style=s; } virtual ~HasDMA(){}; virtual void View()const;};#endif
//file2 threehead.cpp#include"threehead.h"void DMA::View()const{ cout << "---DMA---"<<endl; cout << "Lable : " << la() << endl; cout << "Rating : " << ra() << endl;}void LackDMA::View()const{ cout << "---LackDMA---" << endl; cout << "Lable : " << la() << endl; cout << "Rating : " << ra() << endl; cout << "Clolr : " << color << endl;}void HasDMA::View()const{ cout << "---HasDMA---" << endl; cout << "Lable : " << la() << endl; cout << "Rating : " << ra() << endl; cout << "Style : " << style << endl;}
//file3 three.cpp#include"threehead.h"#include<string>using namespace std;void readf(int); char s1[40]; char s2[40]; int i1;int main(){ int kind; DMA a; LackDMA b; HasDMA c; cout << "Choose class 1 ,2 , 3 to save(q to quit): "; cin >> kind; while (cin) { if (kind == 1) { cout << "MODE 1\n"; readf(kind); a = DMA(s2, i1); } else if (kind == 2) { cout << "MODE 2\nEnter color: "; readf(kind); b = LackDMA(s1, s2, i1); } else if (kind==3) { cout << "MODE 3\nEnter style: "; readf(kind); c = HasDMA(s1, s2, i1); } else { break; } cout << "Choose class 1 ,2 , 3 to save(q to quit): "; cin >> kind; } a.View(); b.View(); c.View(); cout << "Done!"<<endl; return 0;}void readf(int i){ cin.get(); if (i == 1) { cout << "Enter lable: "; cin.getline(s2, 30); cout << "Enter rating: "; cin >> i1; } else { cin.getline(s1, 30); cout << "Enter lable: "; cin.getline(s2, 30); cout << "Enter rating: "; cin >> i1; }}
第四题:修改实例程序,补全类,补全定义
//file1 fourhead.h#ifndef FOURHEAD_H_#define FOURHEAD_H_#include<iostream>using namespace std;class Port{public: Port(char * br="none",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 BottoleCount()const{ return bottles; }; virtual void Show()const; friend ostream &operator<<(ostream &os,const Port &p);private: char *brand; char style[20]; int bottles;};class VintagePort:public Port{private: char *nickname; int year;public: VintagePort(){}; VintagePort(char * br, int b, char *nn, int y); VintagePort(const VintagePort &vp); //~VintagePort(){ delete[] nickname; }; VintagePort &operator=(const VintagePort &vp); void Show()const; friend ostream & operator<<(ostream & os, const VintagePort &vp);};#endif
//file2 fourhead.cpp#include"fourhead.h"// Port methodPort::Port(char * br, char *st, int b){ brand = br; int len = strlen(st); int i = 0; for (; i < len&&i < 19; i++) style[i] = st[i]; style[i] = '\0'; bottles = b;}Port::Port(const Port&p){ brand = p.brand; strcpy_s(style, p.style); bottles = p.bottles;}Port & Port::operator =(const Port &p){ brand = p.brand; strcpy_s(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) bottles -= b; else cout << "Don,t have so many bottles!"; return *this;}void Port::Show()const { cout << "Brand: " << brand << endl; cout << "Kind: " << style << endl; cout << "Brand: " << bottles << endl;}ostream &operator<<(ostream &os, const Port &p){ os << p.brand << ", " << p.style << ", " << p.bottles; return os;}// VintagePort methodVintagePort::VintagePort(char * br, int b, char *nn, int y) :Port(br, "vintage", b) { nickname = nn; year = y;}VintagePort::VintagePort(const VintagePort &vp) : Port(vp){ nickname = vp.nickname; year = vp.year;}VintagePort &VintagePort::operator=(const VintagePort &vp){ Port::operator=(vp); nickname = vp.nickname; year = vp.year; return *this;}void VintagePort::Show()const{ cout << "---VintgaePort---\n"; Port::Show(); cout << "Nickname: " << nickname<<endl; cout << "Year: " << year<<endl;}ostream & operator<<(ostream & os, const VintagePort &vp){ os << Port(vp); cout << ", " << vp.nickname << ", " << vp.year; return (os);}
//file3 four.cpp#include"fourhead.h"#include<iostream>int main(){ Port port1("por", "tawny", 20); cout << port1<<endl; port1.Show(); VintagePort vp("vpor", 24, "nice", 16); cout << vp << endl; vp.Show(); VintagePort vp3; vp3 = vp; cout << vp3 << endl; port1 +=1; cout << "port1 += 1: "<<port1.BottoleCount() << endl; port1 -= 15; cout << "port1 -= 15: " << port1.BottoleCount() << endl; return 0;}
第十二章还是要补全的,接下来补第十二章。。。
0 0
- 第十三章 类继承
- 第十三章 类继承
- 第十三章 类继承
- 第十三章:类继承
- 第十三章 类的继承
- 【C++ Primer】第十三章 类继承
- C++ Primer Plus学习:第十三章 类继承(1)
- C++ Primer Plus学习:第十三章 类继承(2)
- C++ Primer Plus学习:第十三章 类继承(3)
- Python基础学习--第十三章(类的继承)
- 第十三章:方法 第十四章:构造与析构 第十五章:类继承(322)
- 2012/1/31 《C++ Primer Plus》第十三章:类继承 学习笔记
- 《C++ Primer Plus(第六版)》(25)(第十三章 类继承 笔记)
- 《C++ Primer Plus(第六版)》(26)(第十三章 类继承 复习题答案)
- 《C++ Primer Plus(第六版)》(27)(第十三章 类继承 编程题答案)
- 第十三章 类
- C++读书笔记之类的继承1(第十三章)
- 第十三项目三:CEmployee类继承自CPerson类
- 遵化明天打折4WuU8
- 对象数组
- 阻止默认行为
- 随手记录--爬虫基本概念
- 了解动态网页和动态网页
- 第十三章 类继承
- JS 操作cookie局限性
- Python3 字符串
- Android-->Log系统,Logback的使用体验(slf4j)
- 51nod 乘法逆元(扩展欧几里得)
- Hibernate 异常StrategySelectionException: Unable to resolve name EhCacheRegionFactory
- 阻止冒泡
- 数据结构——栈的学习
- 随手记录-通信协议基础知识