类基类实验5 派生与继承
每日一贴,今天的内容关键字为类基类
1.试验目标和要求:
此试验用两个单元的时光完成,是一个综合性的试验,要求编写的程序涉及到C++的许多知识点,如类的定义,动态分配内存,构造函数,派生,虚基类等。试验内容给出的是一个完全的程序,4个题目实际是类品级。同窗也可以在此基础上发挥增加新的内容。
2.试验内容:
1.定义一个基类MyArray,基类中可以寄存一组数组。
class Myarray
{
int *alist;
int length;
public:
Myarray( int leng);
~Myarray();
void input();
void display();
};
编写构造函数,析构函数及其它函数,实现动态分配内存,释放内存和数据输入输出等功能。并进行调试。
#include<iostream> using namespace std; class Myarray { int *alist; int length; public: Myarray(); Myarray( int leng); ~Myarray(); void input(); void display(); }; Myarray::Myarray() { length=0; alist=NULL; } Myarray::Myarray(int leng) { cout<<"Constructing"<<endl; length=leng; alist=new int[length+1]; } Myarray::~Myarray() { if(alist!=NULL) { delete []alist; length=0; cout<<"Destructing"<<endl; } } void Myarray::input() { if(alist!=NULL) { cout<<"Input"<<length<<" numbers for Myarray"<<endl; for(int i=0; i<length; i++) { cin>>alist[i]; } } } void Myarray::display() { cout<<"Display elements of Myarray"<<endl; for(int i=0; i<length; i++) { cout<<alist[i]<<" "; } cout<<endl; } int main() { Myarray a(10); a.input(); a.display(); return 0; }
2.定义一个类averarray继承自myarray,在类中求数组的平均值,并输出。进行调试。
3.定义一个类revarray继承自 myarray, 使数组按反序寄存,并输出。进行调试。
4. 定义一个类Nawarray继承自averarray和revarray。在继承过程当中声明为虚基类,领会虚基类在解决二义性中的问题中的作用。调试中可以试一试不必虚基类出现的问题。
#include<iostream> using namespace std; class Myarray//定义一个基类MyArray,基类中可以寄存一组数组 { public: int *alist; int length; Myarray(); Myarray( int leng); ~Myarray(); void input(); void display(); }; Myarray::Myarray() { length=0; alist=NULL; } Myarray::Myarray(int leng) { cout<<"Constructing"<<endl; length=leng; alist=new int[length+1]; } Myarray::~Myarray() { if(alist!=NULL) { delete []alist; length=0; cout<<"Destructing"<<endl; } } void Myarray::input() { if(alist!=NULL) { cout<<"Input"<<length<<" numbers for Myarray"<<endl; for(int i=0; i<length; i++) { cin>>alist[i]; } } } void Myarray::display() { cout<<"Display elements of Myarray"<<endl; for(int i=0; i<length; i++) { cout<<alist[i]<<" "; } cout<<endl; } class Averarray:virtual public Myarray//类averarray继承自myarray, { public: double aver; Averarray(int n):Myarray(n) { cout<<"Averarray Constructing"<<endl; aver=0; } ~Averarray() { cout<<"Averarray Destructing"<<endl; } void getAver() { for(int i=0; i<length; i++) { aver+=alist[i]; } cout<<"Aver="<<aver/length<<endl; } }; class Revarray:virtual public Myarray//类Revarray继承自myarray, { public: Revarray(int n):Myarray(n) { cout<<"Revarray Constructing"<<endl; } ~Revarray() { cout<<"Revarray Destructing"<<endl; } void Reverse() { cout<<"The original Revarray"<<endl; display(); for(int i=0; i<(length)/2; i++) { int temp=alist[i]; alist[i]=alist[length-1-i]; alist[length-1-i]=temp; } cout<<"After reverse"<<endl; display(); } void display() { cout<<"Display elements of Nawarray"<<endl; for(int i=0; i<length; i++) cout<<alist[i]<<" "; cout<<endl; } }; class Nawarray:public Averarray,public Revarray { public: Nawarray(int length):Averarray(length),Revarray(length),Myarray(length) { cout<<"Nawarray Constructing"<<endl; } ~Nawarray() { cout<<"Nawarray Destructing"<<endl; } void display() { cout<<"Display elements of Nawarray"<<endl; for(int i=0; i<length; i++) cout<<alist[i]<<" "; cout<<endl; } }; int main() { Myarray m(5); m.input(); m.display(); Averarray a(5); a.input(); a.getAver(); Revarray r(5); r.input(); r.Reverse(); Nawarray n(5); n.input(); n.display(); return 0; }
5. 读程序,回答问题
#include <iostream> using namespace std; class A { public: void f1(); A() { i1=10; j1=11; } protected: int j1; private: int i1; }; class B:private A { public: void f2(); B() { i2=20; j2=21; } protected: int j2; private: int i2; }; class C: public B { public: void f3(); C() { i3=30; j3=31; } protected: int j3; private: int i3; }; int main() { return 0; }
回答以下问题:
派生类B中成员函数f2()能否拜访基类A中的成员f1()、i1和j1?
派生类B的对象b能否拜访基类A中的成员f1()、i1和j1?
派生类C中成员函数f3()能否拜访直接基类B中的成员f2()、i2和j2?能否拜访直接基类A中的成员f1()、j1和i1?
派生类C的对象c能否拜访直接基类B中的成员f2()、i2和j2?能否拜访直接基类A中的成员f1()、j1和i1?
6. 编写一个程序,实现字符串操纵:
一个简单串类string,包括输入字符串、返回字符串长度及内容等功能;尚有一个具有编辑功能的串类edit_string,它继承string类,在其中设置一个光标,使其能支持在光标处的插入、替换和删除等编辑功能。
#include<iostream> #include<cstring> using namespace std; class String { public: int length; char *s; String(char *str=NULL); //普通构造函数 String(const String &other); //拷贝构造函数 ~ String(void); // 析构函数 void print(); int getLen(); }; String::String(char *str) { if(str) { this->length=strlen(str); s= new char[length+1]; strcpy(s,str); } } String::String(const String &other) { length=strlen(other.s); s= new char[length+1]; strcpy(s,other.s); } String::~String() { cout<<"Destructing String "<<s<<endl; if(s) delete []s; length=0; } void String::print() { cout<<s<<endl; } int String::getLen() { return length; } class edit_String:public String { public: edit_String(char *s):String(s) { cout<<"Constructing edit_String"<<endl; } void Delete(int p); //实现删除功能 void Insert(int p,char c); //实现插入功能 bool Replace(int p,char c); //实现替换功能 }; void edit_String::Delete(int p) //实现删除功能 { if(s==NULL) { cout<<"Fail to delete,s is empty"<<endl; return; } if(p>=length) { cout<<"p is too big"<<endl; return; } for(int i=0; i<length-1; i++) { if(i>=p-1) { s[i]=s[i+1]; } } length--; } bool edit_String::Replace(int p,char c)//实现替换功能 { if(s==NULL) { cout<<"Fail to replace,s is empty"<<endl; return false; } if(p>=length) { cout<<"p is too big"<<endl; return false; } for(int i=0; i<length; i++) { if(i==p) { s[i]=c; return true; } } return false; } void edit_String::Insert(int p,char c)//实现插入功能 { char* temp=new char[length+1]; for(int i=0; i<=length; i++) { if(i<p) temp[i]=s[i]; else if(i==p) { temp[i]=c; } else { temp[i]=s[i-1]; } } if(s!=NULL) delete s; s= new char[strlen(temp)+1]; length++; strcpy(s,temp); delete []temp; } int main() { char s1[9]="dutclass"; edit_String es(s1); es.print(); es.Delete(3); es.print(); es.Replace(1,'m'); es.print(); es.Insert(3,'w'); es.print(); return 0; }
文章结束给大家分享下程序员的一些笑话语录: PC软件体积大,是因为一个PC软件功能往往较多,能够满足你一个方面的需求,而一个iphone软件往往没几行代码,干一件很小的事情,自然需要的软件就多。就像吃西瓜和吃瓜子的来比数目,单位不同啊。