c++程序设计基础.ppt
第十一章第十一章 程序设计程序设计基础基础问题的提出问题的提出结构化程序设计方法将解决问题的重点放在如何实现过程结构化程序设计方法将解决问题的重点放在如何实现过程的细节方面,而把数据和对数据进行操作的函数截然分开,的细节方面,而把数据和对数据进行操作的函数截然分开,以数据结构为核心,围绕着功能实现或操作流程来设计程以数据结构为核心,围绕着功能实现或操作流程来设计程序。序。程序的基本形式是主模块与若干子模块的组合,即一程序的基本形式是主模块与若干子模块的组合,即一个主个主函数(函数(main 函数)和若干子函数函数)和若干子函数。程序以函数为单位,函。程序以函数为单位,函数之间以数据作为连接的纽带。数之间以数据作为连接的纽带。把数据和操作分开对待把数据和操作分开对待,一旦数据的格式或结构发生变化,一旦数据的格式或结构发生变化,相应的操作函数就得改写,而且对于核心数据的访问往往相应的操作函数就得改写,而且对于核心数据的访问往往也得不到有效控制。也得不到有效控制。教学目标教学目标理解面向对象的概念,理解面向对象程序设计的思想,理解面向对象的概念,理解面向对象程序设计的思想,理解面向对象程序设计的基本方法。理解面向对象程序设计的基本方法。理解抽象、封装、继承、多态等概念。理解抽象、封装、继承、多态等概念。理解类与对象的概念,掌握程序设计中类与对理解类与对象的概念,掌握程序设计中类与对象的定义方法。象的定义方法。理解基类、派生类概念、了解派生类的定义方法。理解基类、派生类概念、了解派生类的定义方法。理解多态性与虚拟函数的概念,了解虚拟函数的定义理解多态性与虚拟函数的概念,了解虚拟函数的定义方法。方法。1.函数的重载函数的重载函数的重载:一个函数可以对应多个函数的实现,可以函数的重载:一个函数可以对应多个函数的实现,可以实现不同的功能实现不同的功能重载函数:重载函数:具有相同的名称,具有不同的参数个数或参具有相同的名称,具有不同的参数个数或参数类型数类型【例例】用重载函数求两个整数或实数中的最大数用重载函数求两个整数或实数中的最大数#include int max(int a,int b)if(ab)return a;else return b;float max(float a,float b)if(ab)return a;else return b;void main()int a,b;float x,y;cinab;cinxy;coutmax(a,b)=max(a,b)endl;coutmax(x,y)=max(x,y)endl;#include double max(double a,double b)if(ab)return a;else return b;void main()int x,y;cinxy;coutmax(x,y)=max(x,y)b)return a;else return b;能否得出正确的运行结果?能否得出正确的运行结果?max(float)x,(float)y)2.带默认参数的函数带默认参数的函数允许实参和形参个数不同允许实参和形参个数不同在形参表中各一个或几个形参指定默认值在形参表中各一个或几个形参指定默认值若没有给指定默认值的形参传值,函数自动使用形参的若没有给指定默认值的形参传值,函数自动使用形参的默认值默认值【例例】设计一个函数,既可以找出两个整型数的最大值,又可设计一个函数,既可以找出两个整型数的最大值,又可以找出三个数的最大值以找出三个数的最大值#include int max(int x,int y,int z=-32768)if(yx)x=y;if(zx)x=z;return x;main()int a,b,c;coutabc;if(c-32768)coutmax(a,b,c)=max(a,b,c)endl;elsecoutmax(a,b)=max(a,b)endl;赋予默认的参数必须放赋予默认的参数必须放在形参表的最右端在形参表的最右端注意:注意:不要同时使用带默认参数的函数和重载函不要同时使用带默认参数的函数和重载函数数(参数个数不同参数个数不同)3.C+新增运算符新增运算符作用域运算符作用域运算符 :指定变量的作用域,可以访问当前作用于之外的变量指定变量的作用域,可以访问当前作用于之外的变量#includeint x=20;/全局变量全局变量void main()float x=8.9;/局部变量局部变量coutx=xendl;/输出局部变量输出局部变量 cout“x=”:xendl;/输出全局变量输出全局变量动态内存分配与撤销运算符动态内存分配与撤销运算符v new自动为变量分配正确长度的内存空间自动为变量分配正确长度的内存空间v分配成功则返回指定类型的一个指针分配成功则返回指定类型的一个指针v若不成功则返回若不成功则返回0v格式:格式:vnew 类型类型 初值初值int*p;p=new int(10);/为指针分配为指针分配10个字节的内存单元个字节的内存单元int*p;p=new int10;/为指针分配为指针分配10个整型元素内存单元个整型元素内存单元vDelete必须用于先前用必须用于先前用new分配的有效指针分配的有效指针v格式:格式:delete 指针变量;指针变量;#include void main()int*p;p=new int10;/为指针为指针p分配分配10个元素的整型数组个元素的整型数组 /的内存单元的内存单元if(!p)/判断返回的是否为空指针判断返回的是否为空指针cout内存分配失败内存分配失败endl;for(int i=0;i10;i+)pi=i;/为为p所指内存单元赋值所指内存单元赋值coutpi;/输出输出p所指内存单元的值所指内存单元的值delete p;/释放为指针释放为指针p分配的内存单元分配的内存单元4.类和对象类和对象类的定义类的定义v将将不同类型的数据不同类型的数据和对这些数据相关的和对这些数据相关的操作操作封装在一起封装在一起class 类名类名 private:私有成员数据及函数私有成员数据及函数;protected:保护成员数据及函数保护成员数据及函数;public:公有成员数据及函数公有成员数据及函数;只能被本身的成员函数调用,外只能被本身的成员函数调用,外界不能调用界不能调用只能被本身的成员函数调用,可只能被本身的成员函数调用,可以被继承以被继承类与外部的接口,任何外部函数类与外部的接口,任何外部函数都可以访问公有数据或函数都可以访问公有数据或函数class Employee private:/私有成员数据私有成员数据 char EmployeeID20;char EmployeeName50;char sex;public:/公有成员数据及函数公有成员数据及函数;Employee();void display();类定义只说明产生了一种新的数据类型,并没类定义只说明产生了一种新的数据类型,并没有为该类数据分配内存空间。有为该类数据分配内存空间。对象的定义对象的定义v两种方式定义对象:两种方式定义对象:1先定义类再定义变量先定义类再定义变量class Employee private:/私有成员数据私有成员数据 char EmployeeID20;char EmployeeName50;char sex;public:Employee();/公有成员数据及函数公有成员数据及函数;void display();Employee ep1,ep2;2定义类的同时定义变量定义类的同时定义变量class Employee private:/私有成员数据私有成员数据 char EmployeeID20;char EmployeeName50;char sex;public:Employee();/公有成员数据及函数公有成员数据及函数;void display();ep1,ep2;成员函数的定义成员函数的定义v只有类的成员函数才能存取该类对象的私有数据成员只有类的成员函数才能存取该类对象的私有数据成员class rect_area private:/私有成员数据私有成员数据 float len;float width;float area;public:/公有成员数据及函数公有成员数据及函数;void area()area=len*width;cout“area=”areaendl;rect_area rectangle;方法的实现方法的实现(成员函数的函数体成员函数的函数体)可以可以在类的内部在类的内部完成完成(类的内联类的内联函数函数),也可以也可以在类的外部在类的外部实现,实现,而且可以与类的定义放在同一个而且可以与类的定义放在同一个源文件中,也可放在不同的源文源文件中,也可放在不同的源文件中。件中。class rect_area private:/私有成员数据私有成员数据 float len;float width;float area;public:/公有成员数据及函数公有成员数据及函数;void area(float len,float width);;rect_area rectangle;若成员函数的实现在类定义的外部,则定义是必若成员函数的实现在类定义的外部,则定义是必须在函数名前加上类名,中间用须在函数名前加上类名,中间用“:”隔开隔开void rect_area:area(float len,float width)area=len*width;cout“area=”areaendl;一般将类的定义放在一般将类的定义放在.h的文件中,而把成员函数的实现放在的文件中,而把成员函数的实现放在一个与一个与.h文件同名的文件同名的.cpp文件中文件中类的成员数据可以是任意类型,但不能对成员数据初始化类的成员数据可以是任意类型,但不能对成员数据初始化class rect_area private:/私有成员数据私有成员数据 float len=10;float width=20;float area;public:/公有成员数据及函数公有成员数据及函数;void area()area=len*width;cout“area=”areaendl;rect_area rectangle;类的私有成员类的私有成员v只有类本身的成员函数或其友元函数可以使用。只有类本身的成员函数或其友元函数可以使用。#include class rect_area private:float len;float width;float area;public:void qarea()area=len*width;coutarea=areaendl;rectangle;void main()rectangle.len=10;rectangle.width=20;rectangle.qarea();public:类的公有成员类的公有成员v可以被类本身的成员函数和外部函数可以使用。可以被类本身的成员函数和外部函数可以使用。#include class rect_area private:float area;public:void qarea(float len,float width)area=len*width;coutarea=areaendl;rectangle;void main()rectangle.qarea(10,20);内联函数内联函数v在类内部定义的成员函数。可提高程序的运行速度,在在类内部定义的成员函数。可提高程序的运行速度,在调用处用内联函数体的代码替换,不需要进行现场处理,调用处用内联函数体的代码替换,不需要进行现场处理,节省了时间和空间开销。节省了时间和空间开销。#include class rect_area private:float area;public:void qarea(float len,float width)area=len*width;coutarea=areaendl;rectangle;#include class rect_area private:float area;public:void qarea(float len,float width);rectangle;void rect_area:qarea(float len,float width)area=len*width;coutarea=areaendl;inlinev内联函数一定在调用前定义,且不允许有循环语句和开内联函数一定在调用前定义,且不允许有循环语句和开关语句,无法递归调用。关语句,无法递归调用。void main()rectangle.qarea(10,20);构造函数构造函数类体中不允许对数据成员进行初始化类体中不允许对数据成员进行初始化用构造函数来初始化对象的数据成员用构造函数来初始化对象的数据成员,使对象在被使用之前,使对象在被使用之前处于一个合理的状态。处于一个合理的状态。为什么要用构造函数?为什么要用构造函数?class classnamepublic:classname();/构造函数构造函数;一般声明为一般声明为public构造函数的名字必须与所在的类名相同构造函数的名字必须与所在的类名相同没有返回值,也不需要加没有返回值,也不需要加void类型声明类型声明在定义类的对象时,由系统自动调用该类的构造函数,而且在定义类的对象时,由系统自动调用该类的构造函数,而且只能调用一次。只能调用一次。若在类定义时没有定义任何构造函数,由系统自动生成一若在类定义时没有定义任何构造函数,由系统自动生成一个不带参数的默认构造函数个不带参数的默认构造函数 classname:classname()在程序中定义一个对象没有指明初始化,则编译器按默认在程序中定义一个对象没有指明初始化,则编译器按默认的构造函数来初始化对象,对象的所有数据初始化为的构造函数来初始化对象,对象的所有数据初始化为0或空。或空。#include class rect_area private:/声明下面部分为私有数据成员声明下面部分为私有数据成员 float area;float len;float width;public:rect_area()/构造函数构造函数 len=10;width=20;area=len*width;coutarea=areaendl;void main()rect_area qarea;#include class rect_area private:/声明下面部分为私有数据成员声明下面部分为私有数据成员 float area;float len;float width;public:rect_area(float len=10,float width=20)/构造函数可以有默认参数构造函数可以有默认参数 area=len*width;coutarea=areaendl;void main()rect_area qarea;构造函数在定义对象的同时调用,如果要通过实参给构构造函数在定义对象的同时调用,如果要通过实参给构造函数传递数据,可以采用如下形式来定义对象。造函数传递数据,可以采用如下形式来定义对象。类名类名 对象名对象名(实参表实参表);void main()rect_area qarea;rect_area qarea1(30,20);rect_area qarea2(20,20);构造函数可以有默认参数,构造函数可以有默认参数,默认参数可以改变默认参数可以改变#include class rect_area private:/声明下面部分为私有数据成员声明下面部分为私有数据成员 float area;float len;float width;public:rect_area()/构造函数构造函数 area=10*20;coutarea=areaendl;rect_area:rect_area(float len=10,float width=20)area=len+width;coutarea=areaendl;void main()rect_area qarea1(30,20);rect_area qarea2;无法确定调用哪个构造函数无法确定调用哪个构造函数有默认参数的函数和没有参数的函数重载时,可能产生二有默认参数的函数和没有参数的函数重载时,可能产生二义性义性析构函数析构函数用于回收构造函数动态申请的存储空间用于回收构造函数动态申请的存储空间构造函数的名字必须与所在的类名相同,前面加构造函数的名字必须与所在的类名相同,前面加没有返回值,也不需要加没有返回值,也不需要加void类型声明类型声明不允许带参数,且不能重载,一个类只有一个析构函数不允许带参数,且不能重载,一个类只有一个析构函数class classnamepublic:classname();/析构函数析构函数;若在类定义时没有定义任何析构函数,由系统自动生成一若在类定义时没有定义任何析构函数,由系统自动生成一个不带参数的默认构造函数个不带参数的默认构造函数 classname:classname()函数中定义对象后,这个对象的生存期从开始定义到函数函数中定义对象后,这个对象的生存期从开始定义到函数结束,此时自动运行解析函数;结束,此时自动运行解析函数;用用new运算符创建的对象用运算符创建的对象用delete运算符释放时,系统自动运算符释放时,系统自动运行解析函数。运行解析函数。#include#include class stud char*name;int ave;public:stud(char*str,int k)/定义构造函数定义构造函数int len;len=strlen(str)+1;name=new charlen;strcpy(name,str);ave=k;stud()/析构函数析构函数 delete name;coutname is delected!endl;void display()/成员函数成员函数coutnames ave is aveendl;void main()stud student(Liu Lin,86);student.display();通常在构造函数中用通常在构造函数中用new为为变量申请存储空间,在析构变量申请存储空间,在析构函数中用函数中用delete释放已分配释放已分配的空间的空间#include#include class stud/类定义类定义 char*name;int ave;public:stud(char*str,int k);stud();void display();stud:stud(char*str,int k)/在类定义之外定义构造函数在类定义之外定义构造函数int len;len=strlen(str)+1;name=new charlen;strcpy(name,str);ave=k;stud:stud()/在类定义之外定义析构函数在类定义之外定义析构函数delete name;coutname is delected!endl;void stud:display()coutnames ave is aveendl;void main()stud student(Liu Lin,86);student.display();类的友元类的友元友元函数或友元类的成员函数可以访问类的私有成员友元函数或友元类的成员函数可以访问类的私有成员友元函数友元函数在类中声明,在类外定义在类中声明,在类外定义声明时在函数类型前加上声明时在函数类型前加上friend可将其他类的成员函数或非成员函数声明为该类的可将其他类的成员函数或非成员函数声明为该类的“友元友元”#include class frect_area private:/声明下面部分为私有数据成员声明下面部分为私有数据成员 float area;float len;float width;public:frect_area(float x,float y)len=x;width=y;friend void rect_area(frect_area class_sub);/声明函数声明函数rect_area为类为类frect_area的友元的友元;void rect_area(frect_area class_sub)/友元函数的定义友元函数的定义 class_sub.area=class_sub.len*class_sub.width;/通过友元函数访问类的私有成员通过友元函数访问类的私有成员 coutarea=class_sub.areaendl;void main()frect_area prect(5,2);rect_area(prect);定义与普通函数定义基本相同,而与成员函数的定义不同,定义与普通函数定义基本相同,而与成员函数的定义不同,前面不需要加类名和作用域运算符前面不需要加类名和作用域运算符:友元类友元类若若A是是B的友元类,则的友元类,则A的所有成员函数都是的所有成员函数都是B 的友元函数,的友元函数,都可以访问都可以访问B的私有成员和保护成员。的私有成员和保护成员。class Bfriend class A;/声明声明A是是B的友元类的友元类;友元类不一定是相互的友元类不一定是相互的#include class A private:/声明下面部分为私有数据成员声明下面部分为私有数据成员 float area;float len;float width;public:A(float x,float y)len=x;width=y;friend class B;/将将B类定义为类定义为A类的友元类类的友元类;class B /B类的成员函数可以直接引用类的成员函数可以直接引用A类的私有数据成员类的私有数据成员 public:void rect_area(A a)a.area=a.len*a.width;coutarea=a.area成员变量成员变量当对象调用成员函数时,该成员函数的当对象调用成员函数时,该成员函数的this指针便指针便指向这指向这个对象个对象不能用不能用this指针调用类的友元函数指针调用类的友元函数,因为友元函数不是类,因为友元函数不是类的成员,也不能用的成员,也不能用this指针指向类的静态成员。指针指向类的静态成员。#include class A int i;public:/公有部分公有部分A(int j=0)this-i=j;/this指针的应用指针的应用A add(int k)this-i*=k;return*this;void disp()/用于输出的成员函数用于输出的成员函数couti=iendl;coutthe value of this pointer isthisendl;void main()A a1(5);a1.disp();A a2=a1.add(5);a2.disp();5.重载重载成员函数重载成员函数重载函数名相同,但参数个数或类型不同函数名相同,但参数个数或类型不同#include class max_classpublic:int max(int a,int b);/重载函数重载函数float max(float a,float b);int max_class:max(int a,int b)/类的重载函数的定义类的重载函数的定义if(ab)return a;elsereturn b;float max_class:max(float a,float b)/类的重载函数的定义类的重载函数的定义if(ab)return a;elsereturn b;void main()max_class outmax;int x,y;float a,b;coutxy;/输入输入x,ycoutab;/输入输入a,bcoutmax(x,y)=outmax.max(x,y)endl;/输出结果输出结果 coutmax(a,b)=outmax.max(a,b)endl;构造函数重载构造函数重载#include class max_classpublic:max_class(int a,int b,int c);/定义重载的构造函数定义重载的构造函数max_class(float a,float b);max_class:max_class(int a,int b,int c)/定义构造函数定义构造函数max_class(int a,int b,int c)if(ba)a=b;if(ca)a=c;coutmax(a,b,c)=ab)coutmax(a,b)=aendl;elsecoutmax(a,b)=bendl;void main()max_class A(9,5,8);/声明对象声明对象max_class B(5.6,9.3);系统根据不同的参数分别调用不同的构造函数系统根据不同的参数分别调用不同的构造函数1.重载为类的成员函数重载为类的成员函数 在类内定义运算符重载函数的格式为:在类内定义运算符重载函数的格式为:operator()以以 operator 为关键字,编译器可以很容易将为关键字,编译器可以很容易将运算符重载函数与其他成员函数区别开来。运算符重载函数与其他成员函数区别开来。运算符重载的两种方式运算符重载的两种方式在类外定义运算符重载函数的格式为:在类外定义运算符重载函数的格式为::operator ()特殊的成员函数名特殊的成员函数名class Complex float Real,Image;public:.Complex(float a=0,float b=0)Real=a;Image=b;Complex operator+(const Complex&c);Complex operator+(double);Complex operator-(const Complex&c);Complex operator-(double);Complex operator-(void);.;【例例】实现复数类的实现复数类的“+”,“-”等重载运算等重载运算(运算符重载运算符重载.cpp)Complex Complex:operator+(const Complex&c)return Complex(Real+c.Real,Image+c.Image);Complex Complex:operator+(double r)return Complex(Real+r,Image);Complex Complex:operator-(void)return Complex(-Real,-Image);void main()Complex c1(2,3),c2(4,-2),c3;c3=c1+c2;c3=c1+5;c3=-c1;编译器将编译器将 c1+c2 解释为:解释为:c1.operator+(c2)将将 c1+5 解释为:解释为:c1.operator+(5)第第1个运算量是对象,第个运算量是对象,第2个运算量是参数。个运算量是参数。将将-c1 解释为:解释为:c1.operator()当用成员函数实现运算符的重载时,重载函数的当用成员函数实现运算符的重载时,重载函数的 参数个数只能是参数个数只能是 0 个或个或 1 个。分别实现:一元、二元个。分别实现:一元、二元 运算符的重载。运算符的重载。2.重载为友元函数重载为友元函数 在在类内类内定义友元重载函数的格式为:定义友元重载函数的格式为:friend operator ()在在类外类外定义友元重载函数的格式为:定义友元重载函数的格式为:operator ()class Complex float Real,Image;public:.friend Complex operator+(const Complex&c1,const Complex&c2);friend Complex operator(const Complex&c);.;Complex operator+(const Complex&c1,const Complex&c2)/二元运算二元运算 Complex t;t.Real=c1.Real+c2.Real;t.Image=c1.Image+c2.Image;return t;Complex operator(const Complex c)/一元运算一元运算 return Complex(c.Real,c.Image);不是不是类类的成的成员员函数函数在在 main()函数中函数中,若有若有 Complex c1,c2;则编译则编译器将器将 c1+c2 解解释为释为:operator+(c1,c2)将将 c1 解解释为释为:operator(c1)【例例】用友元函数实现复数类的用友元函数实现复数类的“+”和和“”重载运算重载运算 当用友元函数实现运算符的重载时,重载函数的当用友元函数实现运算符的重载时,重载函数的 参数个数只能是参数个数只能是1 个或个或 2 个。个。分别实现:分别实现:一元一元运算符重载、运算符重载、二元二元运算符重载运算符重载3.两种重载方式的比较两种重载方式的比较 成员实现:成员实现:将将 c1+c2 解释为:解释为:c1.operator+(c2)友元实现:友元实现:将将 c1+c2 解释为:解释为:operator+(c1,c2)成员实现:成员实现:将将 c1+5.6 解释为:解释为:c1.operator+(5.6)友元实现:友元实现:将将 c1+5.6 解释为:解释为:operator+(c1,5.6)成员实现:成员实现:将将 5.6+c1解释为:解释为:5.6.operator+(c1)友元实现:友元实现:将将 5.6+c1解释为:解释为:operator+(5.6,c1)class Student int num;char name30;char sex;public:void display()/对成员函数对成员函数display的定义的定义 coutnum:numendl;coutname:nameendl;coutsex:sexendl;6.继承继承class Studend1 int num;/此行原来己有此行原来己有 char name20;/此行原来己有此行原来己有 char sex;/此行原来己有此行原来己有 int age;char addr20;public:void display();/此行原来己有此行原来己有 coutnum:numendl;/此行原来己有此行原来己有 coutname:nameendl;/此行原来己有此行原来己有 coutsex:sexendl;/此行原来己有此行原来己有 coutage:ageendl;coutaddress:addrendl;利用原来定义的类利用原来定义的类Student作为基础,再加上新的内容即可,作为基础,再加上新的内容即可,以减少重复的工作量。以减少重复的工作量。C+提供的继承机制就是为了解决这提供的继承机制就是为了解决这个问题。个问题。在在C+中所谓中所谓“继承继承”就是在一个已存在的类的基础上建立就是在一个已存在的类的基础上建立一个新的类。已存在的类称为一个新的类。已存在的类称为“基类基类(base class)”或或“父类父类(father class)”。新建立的类称为。新建立的类称为“派生类派生类(derived class)”或或“子类子类(son class)”。class Student1:public Student/声明基类是声明基类是Studentprivate:int age;/新增加的数据成员新增加的数据成员 string addr;/新增加的数据成员新增加的数据成员public:void display_1()/新增加的成员函数新增加的成员函数 coutage:ageendl;coutaddress:addrendl;类类A派生类派生类B:类:类A为基类,类为基类,类B为派生类。为派生类。AB新增加的成员数新增加的成员数据和成员函数据和成员函数基类与派生类基类与派生类被继承的类叫基类被继承的类叫基类(baseclass)或或父类父类,继承后产生的类叫,继承后产生的类叫派生类派生类(derivedclass)或或子类子类拥有自己的新数据和成员函数,还可以拥有父类的数据成拥有自己的新数据和成员函数,还可以拥有父类的数据成员和成员函数。员和成员函数。任何类都可以成为基类,一个基类可以有多个派生类,一任何类都可以成为基类,一个基类可以有多个派生类,一个派生类还可以成为其他类的基类。个派生类还可以成为其他类的基类。class 派生类名派生类名:继承方式继承方式基类名基类名派生类新增的数据成员;派生类新增的数据成员;派生类新增的成员函数;派生类新增的成员函数;规定如访问基类的成员,可以规定如访问基类的成员,可以有有private,public,protected公有派生公有派生class ClassName:public BaseClassName公公有有派派生生时时,基基类类中中所所有有成成员员在在派派生生类类中中保保持持各各个个成成员员的的访访问权限问权限。公有派生,派生类中保持基类的成员特性公有派生,派生类中保持基类的成员特性基类成员属性基类成员属性派生类中派生类中派生类外派生类外公有公有可以引用可以引用可以引用可以引用保护保护可以引用可以引用不可引用不可引用私有私有不可引用不可引用不可引用不可引用基类:基类:public:在派生类和类外可以使用在派生类和类外可以使用protected:在派生类中使用在派生类中使用private:不能在派生类中使用不能在派生类中使用class A int x;protected:int y;public:int z;A(int a,int b,int c)x=a;y=b;z=c;/基类初始化基类初始化 int Getx()return x;/返回返回x int Gety()return y;/返回返回y void ShowA()cout x=xty=ytz=zn;class B:public Aint m,n;public:B(int a,int b,int c,int d,int e):A(a,b,c)m=d;n=e;void Show()cout“m=mt“n=nn;coutx=Getx()ty=ytz=zn;int Sum()return(Getx()+y+z+m+n);void main(void)B b1(1,2,3,4,5);b1.ShowA();b1.Show();cout Sum=b1.Sum()n;coutx=b1.Getx()t;cout y=b1.Gety()t;cout z=b1.zn;公有派生公有派生对基类初始化对基类初始化因为因为x是基类私有,所以在派生类和类是基类私有,所以在派生类和类外不能直接引用外不能直接引用因为因为y是基类保护,所以在派生类中可以是基类保护,所以在派生类中可以直接引用。而在类外不可直接引用。直接引用。而在类外不可直接引用。因为因为z是基类公有,所以在派生类是基类公有,所以在派生类中和类外均可直接引用。中和类外均可直接引用。私有派生私有派生class ClassName:private BaseClassName私私有有派派生生时时,基基类类中中公公有有成成员员和和保保护护成成员员在在派派生生类类中中均均变变为为私私有有的的,在在派派生生类类中中仍仍可可直直接接使使用用这这些些成成员员,基基类类中中的的私私有有成员,在派生类中不可直接使用。成员,在派生类中不可直接使用。私有派生,派生类中基类公有和保护成员成为私有私有派生,派生类中基类公有和保护成员成为私有基类成员属性基类成员属性派生类派生类派生类外派生类外公有公有可以引用可以引用不可引用不可引用保护保护可以引用可以引用不可引用不可引用私有私有不可引用不可引用不可引用不可引用基类:基类:public:(变为私有变为私有)在派生类中使用,类外不可使用在派