816306411_5_实验七 继承与派生
c 继承与派生实验报告
c 继承与派生实验报告
C 继承与派生实验报告
实验目的:通过实验,掌握C语言中继承与派生的概念和使用方法,加深对面向对象编程的理解。
实验内容:在C语言中,继承与派生是面向对象编程中非常重要的概念。
在本次实验中,我们将通过一个简单的例子来演示C语言中的继承与派生的用法。
首先,我们定义一个基类(父类)Person,包括姓名和年龄两个成员变量,以及一个显示信息的成员函数。
然后,我们定义一个派生类(子类)Student,继承自Person类,新增一个成员变量学号,并重写显示信息的成员函数。
在实验中,我们首先创建一个Person对象,设置姓名和年龄,然后调用显示信息函数,观察结果。
接着,我们创建一个Student对象,设置姓名、年龄和学号,再次调用显示信息函数,观察结果。
实验结果:通过实验,我们成功实现了C语言中的继承与派生。
我们发现,通过继承,子类Student可以直接使用父类Person中的成员变量和成员函数,同时可以新增自己的成员变量和函数。
这样的设计使得代码更加简洁和灵活,提高了代码的复用性和可维护性。
结论:C语言中的继承与派生是面向对象编程中非常重要的概念,通过本次实验,我们深入理解了这一概念的用法和意义。
掌握了继承与派生的方法后,我们可以更加灵活地设计和编写程序,提高代码的质量和效率。
总结:通过本次实验,我们对C语言中的继承与派生有了更深入的理解,加深了对面向对象编程的认识。
在今后的学习和工作中,我们将更加灵活地运用继承与派生的方法,提高代码的质量和效率。
C++语言程序设计实验答案_继承与派生教学提纲
C++语言程序设计实验答案_继承与派生实验07 继承与派生(4学时)(第7章继承与派生)一、实验目的二、实验任务7_1 声明一个基类Animal。
有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。
7_2 声明一个基类BaseClass。
有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
7_3 声明一个车(vehicle)基类。
具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?编程试试看。
7_4 以实验6中的People(人员)类为基类。
派生出student(学生)类,添加属性:班号char classNo[7];派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。
从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。
重载相应的成员函数,测试这些类。
类之间的关系如图7-1所示。
图7-1 类图三、实验步骤1.(编程)声明基类Animal,成员变量age声明为私有的。
构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制到Word文件中,不会出现汉字的乱码)把age改为公有变量后重新编译就可以了。
继承和派生实验报告
实验目的与要求:1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。
2.掌握派生类构造函数初始化基类成员和对象成员的方法。
3.掌握内联函数和默认函数。
4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。
实验过程及内容:1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在派生类中访问基类成员。
①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员;②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数;③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。
编程测试所定义的类体系。
本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。
2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。
要求计算圆柱的底面积、侧面积、全面积和体积。
请编写所有完整的成员函数,并编写主函数进行验证。
数据处理1.(1)(2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。
(3)在Line类中添加两个数据成员。
2. #include <iostream>#include <cmath>using namespace std;#define PI 3.14159class Point{friend class Line;protected:double x, y ;public:Point(){x = 0 ; y = 0 ; }Point(double xv,double yv){ x = xv; y = yv; }double Area(){return 0;}void Show() {cout<<"x="<<x<<' '<<"y="<<y<<endl;}};class Circle :public Point{protected:double radius;public:Circle(){ x = 0; y = 0; radius = 0; }Circle(double xv,double yv,double vv):Point(xv,yv){ //调用基类构造函数radius = vv;}Circle(Circle & cir):Point(cir){ //按赋值兼容规则cir可为Point实参radius=cir.radius;}Circle & operator=(Circle & cir){this->Point::operator=(cir); //在派生类中定义重载的拷贝赋值操作符有固定的标准格式radius=cir.radius;return *this;}double Area(){return PI*radius*radius;}void Show()cout<<"x="<<x<<' '<<"y="<<y<<" radius="<<radius<<endl; //访问基类的数据成员}};class Cylinder:public Circle {double high;public:Cylinder(){ x = 0; y = 0; radius = 0;high=0; }Cylinder(double xv,double yv,double vv,double kv):Circle(xv,yv,vv){ //调用基类构造函数high=kv;}Cylinder(Cylinder & cyl):Circle(cyl){ //按赋值兼容规则cyl可为Cylinder实参high=cyl.high;}Cylinder & operator=(Cylinder & cyl){this->Circle :: operator=(cyl); //在派生类中定义重载的拷贝赋值操作符有固定的标准格式high=cyl.high;return *this;}double ceArea(){return 2*PI*radius*high;}double quArea(){return ceArea()+2* Area();}double volume(){return Area()*high;}void Show(){cout<<"x="<<x<<' '<<"y="<<y<<' '<<"radius="<<radius<<' '<<"high="<<high<<endl; //访问基类的数据成员};class Line{Point start,end; //对象成员public:Line(){} //对象成员初始化Line(double xv1,double yv1,double xv2,double yv2) :start(xv1,yv1),end(xv2,yv2){ }double GetLength() {return sqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y));}double Area(){return 0;}void Show(){cout<<"start point:\n";start.Show();cout<<"end point:\n";end.Show();}};int main(){Point pt(0,0);Circle cl1(100,100,10),cl2(cl1),cl3;Cylinder h1(50,50,20,30),h2(h1),h3;Line ln1(0,0,100,100),ln2;cout<<"点面积:"<<pt.Area()<<endl;pt.Show();cout<<"cl1圆面积:"<<cl1.Area()<<endl;cl1.Show();cout<<"cl2圆面积:"<<cl2.Area()<<endl;cl2.Show();cl3=cl1;cout<<"cl3圆面积:"<<cl3.Area()<<endl;cl3.Show();cout<<"h1底面积:"<<h1.Area()<<endl;cout<<"h1侧面积:"<<h1.ceArea()<<endl;cout<<"h1全面积:"<<h1.quArea()<<endl;cout<<"h1体积:"<<h1.volume()<<endl;h1.Show();cout<<"h2底面积:"<<h2.Area()<<endl;cout<<"h2侧面积:"<<h2.ceArea()<<endl;cout<<"h2全面积:"<<h2.quArea()<<endl;cout<<"h2体积:"<<h2.volume()<<endl;h2.Show();h3=h1;cout<<"h3底面积:"<<h3.Area()<<endl;cout<<"h3侧面积:"<<h3.ceArea()<<endl;cout<<"h3全面积:"<<h3.quArea()<<endl;cout<<"h3体积:"<<h3.volume()<<endl;h3.Show();cout<<"线面积:"<<ln1. Area()<<'\t'<<"线长度:"<<ln1. GetLength()<<endl;ln1.Show();ln2.Show();return 0;}实验结论:通过这次实验,我对类的继承和派生,派生类构造函数初始化基类成员和对象成员的方法,以及赋值兼容原则有了更深的理解。
C++实验七继承和派生
实验七继承和派生实验目的∙学习声明和使用类的继承关系,声明派生类。
∙熟悉不同继承方式下对基类成员的访问控制。
∙学习利用虚基类解决二义性问题。
∙理解继承中构造函数和析构函数的调用规则。
实验内容:一、程序分析题1阅读下面的程序,写出运行结果。
#include<iostream>using namespace std;class A{public:A(){a=0;cout<<"调用A的默认构造函数!\n";}A(int i){a=i;cout<<"调用A的带参数构造函数!\n";}~A(){cout<<"调用A的默认析构函数!\n";}void Print() const{cout<<a<<",";}int Geta(){return a;}private:int a;};class B:public A{public:B(){b=0;cout<<"调用B的默认构造函数!\n";}B(int i,int j,int k);~B(){cout<<"调用B的默认析构函数!\n";}void Print();private:int b;A aa;};B::B(int i,int j,int k):A(i),aa(j){b=k;cout<<"调用B的构造函数!\n";};void B::Print(){A::Print();cout<<b<<","<<aa.Geta()<<endl;int main(){B bb(1,2,5);bb.Print();return 0;}2阅读下面程序,写出运行结果。
C 程序设计实验报告 继承与派生
《C++程序设计》实验报告Exercise7继承与派生1实验目的(1)学习定义和使用类的继承关系,定义派生类。
(2)熟悉不同继承方式下对基类成员的访问控制。
(3)学习利用虚基类解决二义性问题。
2实验要求(1)定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还回有问题吗?编程试之。
源程序代码:#include<iostream>using namespace std;class Animal{public:Animal(){age=0;cout<<"构造了Animal对象"<<endl;}~Animal(){cout<<"析构了Animal对象"<<endl;}void display(){cout<<"Its age is"<<age<<"years old"<<endl;}int age;};class Dog:public Animal{public:Dog(){cout<<"构造了Dog对象"<<endl;}~Dog(){cout<<"析构了Animal对象"<<endl;}int setAge(int n){age=n;return age;}};int main(){Dog mimi;mimi.setAge(3);mimi.display();return0;}运行结果:(2)定义一个基类BaseClass,有整型变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
实验七类的继承和派生
实验七类的继承和派生一.实验目的与要求1.掌握类的继承与派生的实现方法。
2.熟悉单继承下派生类的构造函数和析构函数的设计。
3.掌握类成员的标识与访问方法。
4.熟悉类组合的设计方法和应用二. 实验任务1.已知交通工具类(vehicle)定义如下:class vehicle{protected:int wheels; // 车轮数public:vehicle(int wh=0);void init(int wh); //设置车轮数int get_wheels(); //返回车轮数void print(); //输出车轮数};要求:(1)实现vehicle类;(2)定义公有派生类:小车类(car)。
数据成员新增“载人数”;成员函数新增构造函数、init(设置车轮数和载人数),getpassenger(获取载人数),print (输出车轮数和载人数)。
2.已知点类(point)定义如下:class Point{private:double x,y;public:Point(double i=0,double j=0) ;double getx(); //返回x的值double gety(); //返回y的值};要求:(1)实现point类;(2)用组合的方法声明一个矩形类,数据成员包括矩形左上角和右下角两个点的坐标;成员函数包括构造函数、求矩形长、宽、周长以及面积的函数。
1、#include <iostream>#include <string>using namespace std;int wh,num;class vehicle{protected:int wheels;public:vehicle(){wheels=0;}vehicle(int wh){wheels=wh;}void init(int wh);int get_wheels();virtual void print();};void vehicle::init(int wh){wheels=wh;}int vehicle::get_wheels(){return(wheels);}void vehicle::print(){cout<<"车轮数为"<<wheels<<endl;}class car:public vehicle{protected:int number;public:car(){wheels=0;number=0;}car(int wh):vehicle(wh){wh=0;num=0;}car(int wh,int num):vehicle(wh){wheels=wh;number=num;} void init(int wh,int num);int getpassenger();virtual void print();};void car::init(int wh,int num){wheels=wh;number=num;}int car::getpassenger(){return(number);}void car::print(){cout<<"车轮数为"<<wheels<<endl;cout<<"载人数为"<<number<<endl; }int main(){int wh,num;vehicle vehicle1,vehicle2;vehicle1.get_wheels();vehicle1.print();cout<<"请输入车轮数"<<endl;cin>>wh;vehicle2.init(wh);vehicle2.get_wheels();vehicle *pt=&vehicle2;pt->print();car car1,car2;car1.getpassenger();car1.print();cout<<"请输入载人数"<<endl;cin>>num;car2.init(wh,num);car2.getpassenger();pt=&car2;pt->print();return 0;}2、#include <iostream>#include <cmath>using namespace std;class point{private:double x;double y;public:point(int i=0,int j=0);void Point(double i,double j);double getx();double gety();};point::point(double i,double j):x(i),y(j){}void point::Point(double i,double j){x=i;y=j;}double point::getx(){return(x);}double point::gety(){return(y);}class rectangular:public point{private:point p1;point p2;double length;double width;public:Rectangular(point p3,point p4):p1(p3),p2(p4){} double side();double perimeter();double area();};point rectangular::side(){double a,b,c,d;a=p1.getx();b=p2.getx();length=fabs(a-b);cout<<"length="<<length<<endl;c=p1.gety();d=p2.gety();width=fabs(c-d);cout<<"width="<<width<<endl;}double rectangular::perimeter(){return(2*(length+width));}double rectangular::area(){return(length*width);}int main(){int i,j,k,l,h,e;point p1,p2;cout<<"x="<<p1.getx()<<endl;cout<<"y="<<p1.gety()<<endl;cout<<"请输入矩形左下角和右上角两点坐标的横纵坐标值"<<endl;cin>>i>>j;p2.Point(i,j);cout<<"x="<<p2.getx()<<endl;cout<<"y="<<p2.gety()<<endl;rectangular rectangular1;rectangular(p1,p2);rectangular1.side();rectangular1.perimeter();cout<<"perimeter="<<rectangular1.perimeter()<<endl;rectangular1.area();cout<<"area="<<rectangular1.area()<<endl;return 0;}。
C语言程序设计实验答案继承与派生
实验07 继承与派生(4学时)(第7章继承与派生)一、实验目的二、实验任务7_1 声明一个基类Animal。
有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age 赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。
7_2 声明一个基类BaseClass。
有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
7_3 声明一个车(vehicle)基类。
具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?编程试试看。
7_4 以实验6中的People(人员)类为基类。
派生出student(学生)类,添加属性:班号char classNo[7];派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。
从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。
重载相应的成员函数,测试这些类。
类之间的关系如图7-1所示。
图7-1 类图三、实验步骤1.(编程)声明基类Animal,成员变量age声明为私有的。
构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制到把age改为公有变量后重新编译就可以了。
继承与派生实验报告
继承与派生实验报告继承与派生实验报告引言:继承与派生是面向对象编程中的重要概念,通过继承,一个类可以派生出子类,从而实现代码的复用和扩展。
本文将通过实验来探讨继承与派生的概念、原理和应用。
实验目的:1. 理解继承与派生的概念和原理;2. 掌握如何在编程语言中实现继承和派生;3. 熟悉继承与派生的应用场景。
实验步骤:1. 创建父类:首先,我们创建一个名为"Animal"的父类,该类具有属性和方法,例如"age"和"eat()"。
2. 创建子类:接下来,我们创建一个名为"Cat"的子类,该类继承自"Animal"类。
在子类中,我们可以重写父类的方法或添加新的方法。
3. 实例化对象:通过实例化父类和子类的对象,我们可以调用它们的方法和访问它们的属性。
4. 测试继承与派生:我们可以通过调用父类和子类的方法,观察它们的行为是否符合预期。
实验结果:在创建父类"Animal"时,我们定义了一个"age"属性和一个"eat()"方法。
在创建子类"Cat"时,我们继承了父类的属性和方法,并添加了一个新的"meow()"方法。
在实例化父类对象时,我们可以通过调用"eat()"方法来模拟动物进食的行为。
而在实例化子类对象时,我们既可以调用从父类继承而来的"eat()"方法,也可以调用子类特有的"meow()"方法来模拟猫咪的叫声。
通过实验,我们发现继承与派生的优势在于代码的复用和扩展。
我们只需在父类中定义一次通用的属性和方法,然后让不同的子类继承父类,即可实现代码的复用。
同时,子类还可以通过重写父类的方法或添加新的方法,实现代码的扩展和个性化。
讨论与应用:继承与派生不仅仅局限于上述的父类和子类关系,它还可以在多层次的继承结构中发挥作用。
《继承和派生》课件
派生类的析构函数
派生类析构函数在销毁派生类对象时 自动调用,用于释放派生类所占用的 资源。
派生类析构函数可以包含代码,用于 清理派生类所占用的资源。
派生类析构函数可以访问基类的析构 函数,通过使用`this`关键字调用基类 析构函数。
派生类析构函数可以重载基类析构函 数,以便在销毁派生类对象时执行特 定的操作。
基类析构函数的调用
在派生类的析构函数中,可以通过使用`this`关键字调 用基类的析构函数,以确保基类资源得到正确释放。
输标02入题
如果在派生类的析构函数中没有显式调用基类的析构 函数,则编译器会自动调用基类的默认析构函数。
01
03
在某些情况下,可能需要显式调用基类的析构函数, 以确保资源得到正确释放。例如,当基类包含动态分
02 继承的方式
公有继承
总结词
公有继承是指子类可以访问父类的公有成员。
详细描述
在公有继承中,子类可以访问父类的公有成员(即不加任 何修饰符的成员),这些成员在子类中保持公有属性。子 类可以继承和使用父类的公有成员,包括函数、变量、常 量等。
总结词
公有继承是实现代码复用的一种方式。
详细描述
通过公有继承,子类可以继承父类的公有成员,从而避免 重复编写相同的代码。这有助于提高代码的复用性和维护 性。
注意事项
虚函数和纯虚函数的使用 应合理规划,避免过度使 用导致程序复杂度和维护 成本增加。
继承和派生的效率问题
继承
通过共享已存在的代码, 减少代码冗余。但也可能 导致内存浪费和性能下降 。
派生
通过扩展已有类,增加新 功能或修改已有功能。但 也可能导致内存消耗增加 和性能下降。
注意事项
C语言程序设计课件第07章继承与派生
造 C::C(){}或C::C(int i,int j){…}
、 表示先调用B类默认的构造函数或带默认形参值的构
析 构
造函数初始化B类数据成员。 C::C(int i,int j):B(i){…} 表示先调用B类带参数的构造函数初始化B类数据成
函 员。
数
29
#include<iostream> using namespace std; class B {public:
类 { public:
成
void InitR(float x, float y,float w, float h)
员
{InitP(x,y);W=w;H=h;}
的
float GetH() {return H;}
访
float GetW() {return W;}
问 private:
控
float W,H;
与 };
多 class B { public:
继 void setB(int); 承 void showB();
private:
int b;
};
class C : public A, private B { public:
void setC(int, int, int); void showC(); private: int c; };
类 class B0 {public:
型
void display()
兼 {cout<<"B0::display()"<<endl;} };
容 class B1: public B0
{public:
void display()
实验七 继承与派生
实验七继承与派生【实验目的】1、掌握继承的概念。
2、理解派生类与基类的关系。
3、理解不同的继承类型。
4、掌握继承下的构造函数和析构函数。
5、掌握单继承和多继承使用方法。
6、理解静态成员。
【实验内容】1、上机分析下面程序,理解继承下构造函数和析构函数的执行顺序。
#include <iostream.h>class A{public:A(){cout<<"Constructor1_A"<< x << endl;}A( int m ) : x( m ){cout<<"Constructor2_A"<< x << endl;}~A(){cout<<"Destructor_A"<< x << endl;}private:int x;};class B : public A{public:B(){cout<<"Constructor1_B"<< y << endl;}B( int m, int n, int l ) : A( m ), a( n ), y( l ){cout<<"Constructor2_B"<< y <<endl;}~B(){cout<<"Destructor_B"<< y << endl;}private:A a;int y;};int main(){B b1, b2(5,6);return 0;}2、在下面一段类定义中,Derived类是有直接基类Base1和Base2所派生的,Derived 类包含有两个间接基类Base,在初始化函数Init中,需要把x1和x2的值分别赋给属于基类Base1的x成员和属于基类Base2的x成员。
C++语言程序设计实验7(继承和派生)
{
return (m + n);
}
};
int main( )
{
Derived objD;
objD.SetXY(1, 2);
objD.SetAB(10, 20);
objD.SetMN(100, 200);
cout<<"M+N="<<objD.m + objD.n<<endl; //派生类对象可以直接访问公有数据
z 多继承时的构造函数(请参考"case07\7_8.cpp") 派生类名::派生类名(基类 1 的形参, 基类 2 的形参, ..., 基类 n 的形参, 本类的形参) :基类名 1(参数), 基类名 2(参数), ..., 基类名 n(参数) { 本类成员初始化赋值语句; };
z 多继承且有内嵌对象时的构造函数(请参考"case07\7_9.cpp", "7_10.cpp", "7_11.cpp") 派生类名::派生类名(基类 1 的形参, 基类 2 的形参, ..., 基类 n 的形参, 本类形参) :基类名 1(参数), 基类名 2(参数), ..., 基类名 n(参数), 对象数据成员的初始化 { 本类成员初始化赋值语句; };
//cout<<"X+Y="<<objD.x + objD.y<<endl; //派生类对象不能直接访问私有数据
cout<<"X+Y="<<objD.GetX( ) + objD.GetY( )<<endl;
C 继承与派生实验报告
C 继承与派生实验报告1. 引言继承与派生是面向对象编程中的基本概念之一,C语言作为一门面向过程的编程语言,也支持继承与派生的概念。
本实验旨在通过编写代码演示C语言中的继承与派生的使用方法,加深对这一概念的理解。
2. 继承与派生的概念继承是一种面向对象编程中的重要概念,通过继承,派生类可以继承基类的属性和方法。
在C语言中,继承是通过结构体嵌套的方式实现的。
派生是继承的一种特殊形式,通过派生,派生类可以在基类的基础上增加新的属性和方法。
3. 实验步骤步骤一:定义基类首先,我们需要定义一个基类,基类包含一些公共的属性和方法。
在C语言中,我们可以使用结构体来定义类。
typedef struct {int x;int y;} Point;上述代码定义了一个名为Point的结构体,它包含了两个整型属性x和y。
这个结构体可以看作是基类。
步骤二:定义派生类接下来,我们可以定义派生类,派生类通过嵌套包含基类的结构体来实现继承。
typedef struct {Point base; // 基类结构体int z; // 派生类自己的属性} Point3D;上述代码定义了一个名为Point3D的结构体,它嵌套包含了基类Point的结构体,并新增了一个整型属性z。
这个结构体可以看作是派生类。
步骤三:使用派生类在定义好派生类后,我们可以使用派生类来创建对象,并调用基类的属性和方法。
int main() {// 创建对象Point3D point3d;point3d.base.x = 1;point3d.base.y = 2;point3d.z = 3;// 调用基类属性printf("x: %d\n", point3d.base.x);printf("y: %d\n", point3d.base.y);// 调用派生类自己的属性printf("z: %d\n", point3d.z);return0;}上述代码示例了如何使用派生类创建对象,并访问基类的属性和派生类自己的属性。
《继承和派生》PPT课件
完整版ppt
15
继承和派生
练习、设计一个圆类,从圆派生圆柱(或圆 锥),并设计成员函数输出圆柱(或圆锥) 的底面面积和体积。
完整版ppt
16
继承关系中构造函数之间的关系
• 派生类不继承基类的构造函数 • 派生类和基类的构造函数之间是一种自动调用的
关系 • 创建派生类对象时,派生类构造函数要调用基类
成员M基类中的存取权 成员M 在private继承后
限
的派生类的存取权限
public
private
protected
private
private
隐藏
完整版ppt
12
受保护继承(protected)和派生
• 基类中公有成员和受保护成员被继承后都是受 保护的
成员M基类中的存取权限 成员M 在protected继承后 的派生类的存取权限
性和行为 • 派生类可以修改继承的属性和行为 • 派生类可以增加新的属性和行为 • 派生类对象也是基类对象 • 派生类对象和基类对象可以被统一管理
完整版ppt
4
继承和派生的基本概念
基类
数据成员 函数成员
派生类
基类
数据成员 函数成员
自己的数据成员 自己的函数成员
完整版ppt
5
继承的意义
• 便于管理系统中的对象 • 系统扩充比较容易- 利用程序代码的再用性
继承和派生
继承和派生的基本概念 单一继承定义 派生类重定义基类函数 基类中成员被继承后存取权限等级的变化 继承关系中构造函数、析构函数之间的关
系 多重继承
完整版ppt
1
继承的例子
• 家具和柜子 • 建筑和房子 • 道路和高速公路 • 动物和猫 • 电视和彩色电视 • 电脑和笔记本电脑
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七继承与派生
【实验目的】
1、掌握继承的概念。
2、理解派生类与基类的关系。
3、理解不同的继承类型。
4、掌握继承下的构造函数和析构函数。
5、掌握单继承和多继承使用方法。
6、理解静态成员。
【实验内容】
1、上机分析下面程序,理解继承下构造函数和析构函数的执行顺序。
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"Constructor1_A"<< x << endl;
}
A( int m ) : x( m )
{
cout<<"Constructor2_A"<< x << endl;
}
~A()
{
cout<<"Destructor_A"<< x << endl;
}
private:
int x;
};
class B : public A
{
public:
B()
{
cout<<"Constructor1_B"<< y << endl;
}
B( int m, int n, int l ) : A( m ), a( n ), y( l )
{
cout<<"Constructor2_B"<< y <<endl;
}
~B()
{
cout<<"Destructor_B"<< y << endl;
}
private:
A a;
int y;
};
int main()
{
B b1, b2(5,6,7);
return 0;
}
2、在下面一段类定义中,Derived类是有直接基类Base1和Base2所公有派生的,Derived 类包含有两个间接基类Base,在初始化函数Init中,需要把x1和x2的值分别赋给属于基类Base1的x成员和属于基类Base2的x成员。
#include<iostream>
using namespace std;
class Base{
protected:
int x;
public:
Base(){x=0;}
};
class Base1:public Base{
public:
Base1(){}
};
class Base2:public Base{
public:
Base2(){}
};
class Derived: (1)
{
public:
Derived(){}
void Init(int x1,int x2){
(2) ;
(3) ;
}
void output(){cout<<Base1::x<<' '<<Base2::x<<endl;}
};
void main()
{
Derived d;
d.Init(5,9);
d.output();
}
3、在下面一段类定义中,Derived类公有继承了基类Base。
需要填充的函数有注释内容给出了功能。
并补充定义主函数,完成派生类对象的定义。
#include<iostream>
using namespace std;
class Base{
private:
int mem1,mem2;
public:
Base(int m1,int m2)
{mem1=m1;mem2=m2;}
void output(){cout<<mem1<<" "<<mem2<<endl;}
};
class Derived:public Base
{
private:
int mem3;
public:
//构造函数,由m1和m2分别初始化mem1和mem2,由m3初始化mem3 Derived(int m1,int m2,int m3);
//输出mem1,mem2和mem3数据成员的值
void output(){
(1) ;
cout<<mem3<<endl;}
};
Derived::Derived(int m1,int m2,int m3): (2)
{ (3) ;}
4、上机分析下面程序,掌握静态成员
# include <iostream>
using namespace std;
class sample
{
public:
sample ( ){ ++n; }
static int HM(){ return n; }
~sample ( ){ --n; }
private:
static int n;
};
int sample::n = 10;
int main()
{
sample c1,c2;
sample *p = new sample();
cout<<sample::HM()<<endl;
delete p;
cout<<sample::HM()<<endl;
return 0;
}
5、设计一个具有继承和派生的类,分析程序输出结果,理解类的继承与派生。
参考程序:
#include <iostream>
using namespace std;
class A
{
public:
void f(int i)
{cout<<i<<endl;}
void g()
{cout<<"g\n";}
};
class B:A
{
public:
void h(){cout<<"h\n";}
A::f;
};
void main()
{
B d1;
d1.f(6);
d1.g();
d1.h();
}
问题:
⑴、执行该程序时,哪个语句会出现编译错误?为什么?
⑵、去掉出错语句后,执行该程序后输出结果如何?
⑶、程序中派生类B是从基类A中继承来的,这种缺省继承方式是哪种继承方式?
⑷、派生类B中,A::f的含意是什么?
⑸、将派生类B的继承改为公有继承方式该程序将输出什么结果?
6、定义一个车类(Vehicle),含有数据成员wheelnum,speed。
派生出自行车类(Bicycle),
增加成员height;派生出汽车类(Car),增加成员seatnum。
要求各类提供必要的构造函数初始化基本成员,并添加显示输出的成员函数。
编写主函数,测试这个层次结构,输出自行车和汽车的相关信息。