湖南大学C++课件3
合集下载
【考研计算机专业课】湖南大学C语言程序设计教程PPT课件 第5讲 数组
第5讲 数组
例题2:定义数组,输入n,输出此递推公式Ti=2Ti-2+i 所产 生数的前 n项, 如: 1,3,5,10,15,26 。 若Ti=2Ti/2+i #define NMAX 100 #include <stdio.h> main() { float t[NMAX]; //定义数组,讲清类型与个数 int i=0,n=0; printf("n=");scanf("%d",&n); t[0]=1;t[1]=3; //给数组元素赋值 for (i=2;i<=n;i++) { t[i]=2*t[i-2]+i; //数组元素之间的相互引用!!! } for (i=0;i<=n;i++) { 。。。 //输出一串数,找最大,最后最大到最前 #define NMAX 5 #include <stdio.h> main(){ int t[NMAX]={10,20,9,34,2};//直接给出每个元素 int fmax=0, imax=0; //最大值,及所在位置 int i=0,n=NMAX,tmp=0; fmax=t[0];imax=0; //假设最大值是首数 for (i=1;i<n;i++) { //依次与1~n-1个数进行比较 if (fmax<t[i]) //如果小于元素[i] {fmax=t[i]; imax=i;} } if (imax>0) { //最大值不在0号位置 tmp=t[0]; //0号杯的水过渡杯tmp,0号空 t[0]=t[imax]; //imax杯水空着的0号杯,imax杯空 t[imax]=tmp; //过渡杯暂存的0号杯水imax杯 } for (i=0;i<n;i++) printf("%d,",t[i]);}
最经典的C教材适合初学者第3章PPT课件
3
3.1 面向对象基本概念
面向对象(object-Oriented,OO)是软件开发的另一种方法,是将软件 从功能、性质等角度抽象出不同的实体,这些实体分别可以完成各种功能, 最后将实体组合成最终能够完成一系列任务的一个完整软件。实现封装和 数据隐藏是面向对象设计的关键技术。
在面向对象程序设计中,数据以及处理这些数据的操作成为一个整体即对 象,同种类型的对象抽象出其共性就形成类。一个类由方法和属性构成, 方法即函数,属性用来描述类的特性,类中的数据可以用类的方法进行处 理,而对外则只需要提供接口,使对象与对象之间进行通信。这样程序之 间结构更简单清晰,模块更独立,更安全,并且可以继承和重用。实际上, 面向对象编程就是一项有关对象设计和对象接口定义的技术,或者说是一 项如何定义程序模块才能使它们“即插即用”的技术。
12
3.2 类及其构成
❖3.2.4 类的成员
1. 类的静态成员
用static关键字修饰的类成员称为类的静态成员。通常那些不会随对象状 态而变化的数据或计算的成员会被定义为类的静态成员。类的变量成员、 方法成员、属性成员、构造函数、事件、运算符等都可以定义为静态成员。 静态成员属于类本身,不管创建了多少个类的实例,它们共享该静态成员。
Employee employee = new Employee(); //访问公共字段 string n = ; //访问私有成员 double s = employee.Salary(); Console.WriteLine("n={0},s={1}", n, s); } }
4
3.1 面向对象基本概念
面向对象具有以下特征: 1. 抽象性 2. 封装性 3. 继承性 4. 多态性
5
3.1 面向对象基本概念
面向对象(object-Oriented,OO)是软件开发的另一种方法,是将软件 从功能、性质等角度抽象出不同的实体,这些实体分别可以完成各种功能, 最后将实体组合成最终能够完成一系列任务的一个完整软件。实现封装和 数据隐藏是面向对象设计的关键技术。
在面向对象程序设计中,数据以及处理这些数据的操作成为一个整体即对 象,同种类型的对象抽象出其共性就形成类。一个类由方法和属性构成, 方法即函数,属性用来描述类的特性,类中的数据可以用类的方法进行处 理,而对外则只需要提供接口,使对象与对象之间进行通信。这样程序之 间结构更简单清晰,模块更独立,更安全,并且可以继承和重用。实际上, 面向对象编程就是一项有关对象设计和对象接口定义的技术,或者说是一 项如何定义程序模块才能使它们“即插即用”的技术。
12
3.2 类及其构成
❖3.2.4 类的成员
1. 类的静态成员
用static关键字修饰的类成员称为类的静态成员。通常那些不会随对象状 态而变化的数据或计算的成员会被定义为类的静态成员。类的变量成员、 方法成员、属性成员、构造函数、事件、运算符等都可以定义为静态成员。 静态成员属于类本身,不管创建了多少个类的实例,它们共享该静态成员。
Employee employee = new Employee(); //访问公共字段 string n = ; //访问私有成员 double s = employee.Salary(); Console.WriteLine("n={0},s={1}", n, s); } }
4
3.1 面向对象基本概念
面向对象具有以下特征: 1. 抽象性 2. 封装性 3. 继承性 4. 多态性
5
c程序设计3 ppt课件
2020/8/4
北京航空航天1大1 学
课程名称:C 语言程序设计
③ 格式符 o、x、u
%o — 按八进制形式输出整数(无符号)
%x — 按十六进制形式输出整数(无符号)
%u — 按无符号整数形式输出整数
④ 格式符 e、g
%e — 按指数形式输出实数
%g — 自动选择 e 和 f 格式中字段宽度较小的一种格式输 出实数, 且不输出无效0.
printf(“i=%3d\nj=%3d\nk=%3d\n",i,j,k); (3) float x=8123.456789;
double y=8123.456789; printf("%f\n%f\n",x,y); (4) float x=123.4, y=123.456; printf("%10.2f\n%10.2f\n",x,y);
⑴ l — 用于输出long 型数据,可与格式符 d, o, x, u 组合,如%ld, %lx ⑵ 整数— 最小字段宽度。可与所有格式符组合。
整数 ≥数据长度,按整数指定的列数输出。 整数 ≤数据长度,按实际长度输出。 ⑶ -(负号)— 在字段宽度内左对齐。(缺省为右对齐) ⑷ 整数1.整数2 — 可于 f、e、s 组合,指定实数和字符串的格式。
如 %7.2f, %-10.5s 其中:整数1 — 最小字段宽度
整数2 — 对于实数,表示小数位数。 对于字符串,表示从字符串的左端截取若干个字符 输出,截取字符的个数由整数2指定。
2020/8/4
北京航空航天1大0 学
课程名称:C 语言程序设计
判断输出: (1) int a=68;
printf("%d,%d ,%c\n",a,'a',a); (2) int i=31,j=4,k=7891;
C面向对象程序设计第3章PPT课件
第3章 结构化程序设计
结构化程序设计方法是由荷兰学者迪克斯特拉 提出的。结构化程序设计的基本思路是自顶向下、逐 步细化,即将一个复杂的问题划分为若干个独立的模 块,然后根据每个模块的复杂情况进一步分解成若干 个子模块,重复此过程,一直分解到各个子模块的任 务简单明确为止。这种模块化、分而治之的方法大大 提高了程序的开发效率,保证了程序的质量。结构化 程序有3种基本结构:顺序结构、选择结构和循环结 构。
3.2.1 if语句
1.单分支语句 if(表达式) {语句;} 其执行过程是:先判断表达式的值为真还是为假,如果表
达式的值为真,则执行if后面花括号中的语句或语句块;反之, 则不执行if后面花括号中的语句,继续向下执行其他语句。 2.双分支语句
if(表达式) {语句块1;}
else {语句块2;}
其执行过程是:先判断if后的表达式的值为真还是为假, 如果表达式的值为真,则执行if后面花括号中的语句或语句块; 反之,则执行else后面花括号中的语句或语句块。
3. 多分支语句
if(表达式) {
单条语句/语句块; } else if(表达式) {
单条语句/语句块; } …… else if(表达式) {
单条语句/语句块; } else {
单条语句/语句块; }
其执行过程是:先判断if后的表达式的值为真还是 为假,如果表达式的值为真,则执行if后面花括号中 的语句或语句块;反之,则依次判断多个else if 后面 的表达式的值为真还是为假,如果某个else if后面的 表达式的值为真,则执行其else if后面花括号中的语 句或语句块,以此类推,如果所有的else if后的表达 式的值均为假,执行else后面花括号中的语句或语句 块。
3.1顺序结构
结构化程序设计方法是由荷兰学者迪克斯特拉 提出的。结构化程序设计的基本思路是自顶向下、逐 步细化,即将一个复杂的问题划分为若干个独立的模 块,然后根据每个模块的复杂情况进一步分解成若干 个子模块,重复此过程,一直分解到各个子模块的任 务简单明确为止。这种模块化、分而治之的方法大大 提高了程序的开发效率,保证了程序的质量。结构化 程序有3种基本结构:顺序结构、选择结构和循环结 构。
3.2.1 if语句
1.单分支语句 if(表达式) {语句;} 其执行过程是:先判断表达式的值为真还是为假,如果表
达式的值为真,则执行if后面花括号中的语句或语句块;反之, 则不执行if后面花括号中的语句,继续向下执行其他语句。 2.双分支语句
if(表达式) {语句块1;}
else {语句块2;}
其执行过程是:先判断if后的表达式的值为真还是为假, 如果表达式的值为真,则执行if后面花括号中的语句或语句块; 反之,则执行else后面花括号中的语句或语句块。
3. 多分支语句
if(表达式) {
单条语句/语句块; } else if(表达式) {
单条语句/语句块; } …… else if(表达式) {
单条语句/语句块; } else {
单条语句/语句块; }
其执行过程是:先判断if后的表达式的值为真还是 为假,如果表达式的值为真,则执行if后面花括号中 的语句或语句块;反之,则依次判断多个else if 后面 的表达式的值为真还是为假,如果某个else if后面的 表达式的值为真,则执行其else if后面花括号中的语 句或语句块,以此类推,如果所有的else if后的表达 式的值均为假,执行else后面花括号中的语句或语句 块。
3.1顺序结构
谭浩强C课件第3章
谭浩强c课件第3章
目录
• 顺序结构程序设计 • 选择结构程序设计 • 循环结构程序设计 • 数组
01
顺序结构程序设计
C语句概述
C语句的作用和分类
C语句是C语言程序的基本组成单位 ,用于完成各种操作。根据功能不同 ,C语句可分为表达式语句、空语句 、复合语句等。
C语句的书写规则
C语句必须以分号结尾,表示一条完整 的指令。多条语句可以放在同一行, 用分号隔开。
04
字符串处理函数
C语言提供了一系列字符串处理 函数,如strlen、strcpy、strcat 等,用于对字符串进行操作。例 如,strlen函数可以计算字符串 的长度;strcpy函数可以将一个 字符串复制到另一个字符数组中 ;strcat函数可以将两个字符串 连接起来。
THANKS
感谢观看
赋值语句
赋值运算符与赋值表达式
赋值运算符“=”用于将右侧表达式的值赋给左侧的变量。 赋值表达式由赋值运算符及其操作数构成,其值等于赋值运 算符右侧表达式的值。
复合的赋值运算符
C语言提供了复合的赋值运算符,如+=、-=、*=、/=等,用 于简化赋值操作。
数据输入输出的概念及在C语言中的实现
数据输入输出的概念
在C语言中,可以使用scanf()函数读取字符数据。读取字符数据时,需要使用格 式控制符“%c”。
字符数据的输出
字符数据的输出可以使用printf()函数实现。在输出字符数据时,同样需要使用格 式控制符“%c”。
格式输入与
格式输入函数scanf()
scanf()函数用于从标准输入设备(通常是键盘)读取格式化输入。其格式控制符与printf()函数类似,用于指定 输入数据的类型和格式。
目录
• 顺序结构程序设计 • 选择结构程序设计 • 循环结构程序设计 • 数组
01
顺序结构程序设计
C语句概述
C语句的作用和分类
C语句是C语言程序的基本组成单位 ,用于完成各种操作。根据功能不同 ,C语句可分为表达式语句、空语句 、复合语句等。
C语句的书写规则
C语句必须以分号结尾,表示一条完整 的指令。多条语句可以放在同一行, 用分号隔开。
04
字符串处理函数
C语言提供了一系列字符串处理 函数,如strlen、strcpy、strcat 等,用于对字符串进行操作。例 如,strlen函数可以计算字符串 的长度;strcpy函数可以将一个 字符串复制到另一个字符数组中 ;strcat函数可以将两个字符串 连接起来。
THANKS
感谢观看
赋值语句
赋值运算符与赋值表达式
赋值运算符“=”用于将右侧表达式的值赋给左侧的变量。 赋值表达式由赋值运算符及其操作数构成,其值等于赋值运 算符右侧表达式的值。
复合的赋值运算符
C语言提供了复合的赋值运算符,如+=、-=、*=、/=等,用 于简化赋值操作。
数据输入输出的概念及在C语言中的实现
数据输入输出的概念
在C语言中,可以使用scanf()函数读取字符数据。读取字符数据时,需要使用格 式控制符“%c”。
字符数据的输出
字符数据的输出可以使用printf()函数实现。在输出字符数据时,同样需要使用格 式控制符“%c”。
格式输入与
格式输入函数scanf()
scanf()函数用于从标准输入设备(通常是键盘)读取格式化输入。其格式控制符与printf()函数类似,用于指定 输入数据的类型和格式。
C程序设计课件(第3章)
整理ppt
6
3.2.1 运算符重载概述
(3)不能创建新的运算符,只能重载c++中已 有的运算符。
(4)有些运算符不能进行重载。如:“.”类成 员运算符、“*”类指向运算符、“::”类 作用域运算符、“?:”条件运算符及 “sizeof”求字节数运算符。
整理ppt
7
3.2.2 运算符重载的实现
运算符重载的本质就是函数重载。在实现过程 中,首先把指定的运算表达式转化为对运算符函数 的调用,运算对象转化为运算符函数的实参,然后 根据实参的类型来确定需要调用的函数,这个过程 是在编译过程中完成的。运算符重载形式有两种: 重载为类的成员函数和重载为类的友元函数。
整理ppt
3
3.2.1 运算符重载概述
{ real = r, image = i; } void Print(); private: double real, image; }; void Complex::Print() { if(image<0) cout<<real<<image<<'i'; else cout<<real<<'+'<<image<<'i'; }
在以前的学习中,C++中预定义的运算符的操 作对象只能是基本数据类型如int或float等。实 际上,对于很多用户自定义的类型(如类),也需 要有类似的运算操作。
例如复数类Complex。
class Complex
{
public:
Complex () { real=image=0; }
Complex (double r, double i)
C程序设计第三版教材PPT第5章讲稿
例如,假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、 1、1,则求解表达式“(x=n1>n2)&&(y=n3>n4)”后,
x的值变为0,而y的值不变,仍等于1!
分析:闰年的条件是:(1)能被4整除,但不能被100整除的年 份都是闰年,如1996,2004年是闰年;(2)能被100整除, 将适又符的C合能提逻供这被辑的两4表0关个达0系整条式运除来件算的表的符示年年和一份份逻个是不辑复闰是运杂年闰算的。符年条如有。件效1!6的0结0,合20使0用0年,是可闰编年写出。合不
关系运算符都是双目运算符,其结合性均为左结合。 关系运算符的优先级低于算术运算符,高于赋值运算符。 在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=, ==和!=的优先级相同。
例如: c>a+b a>b==c a==b<c a=b>c
等效于c>(a+b) 等效于(a>b)==c 等效于a==(b<c ) 等效于a=(b>c )
5.1.1 关系运算符及其优先次序
在C语言中有以下关系运算符:
1) < 小于 2) <= 小于或等于 3) > 大于 4) >= 大于或等于 5) == 等于 6) != 不等于
优先级相同(高) 优先级相同(低)
注意:在C语言中, “等于”关系运算符 是双等号“= =”, 而不是单等号“= ” (赋值运算符)。
例如: if(a+b>c)
{s=0.2*(a+b); printf(“s=0.2*(a+b)=%f\n”,s); }
else { s=0.5*c;
x的值变为0,而y的值不变,仍等于1!
分析:闰年的条件是:(1)能被4整除,但不能被100整除的年 份都是闰年,如1996,2004年是闰年;(2)能被100整除, 将适又符的C合能提逻供这被辑的两4表0关个达0系整条式运除来件算的表的符示年年和一份份逻个是不辑复闰是运杂年闰算的。符年条如有。件效1!6的0结0,合20使0用0年,是可闰编年写出。合不
关系运算符都是双目运算符,其结合性均为左结合。 关系运算符的优先级低于算术运算符,高于赋值运算符。 在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=, ==和!=的优先级相同。
例如: c>a+b a>b==c a==b<c a=b>c
等效于c>(a+b) 等效于(a>b)==c 等效于a==(b<c ) 等效于a=(b>c )
5.1.1 关系运算符及其优先次序
在C语言中有以下关系运算符:
1) < 小于 2) <= 小于或等于 3) > 大于 4) >= 大于或等于 5) == 等于 6) != 不等于
优先级相同(高) 优先级相同(低)
注意:在C语言中, “等于”关系运算符 是双等号“= =”, 而不是单等号“= ” (赋值运算符)。
例如: if(a+b>c)
{s=0.2*(a+b); printf(“s=0.2*(a+b)=%f\n”,s); }
else { s=0.5*c;
陈天华面向对象程序设计C第三ppt第一章ppt文档
半径为4cm
关于类的例子3
用函数 来实现
行为:
启动、行驶、 加速、减速、 刹车、停车
汽车类
用数据 来描述
状态: 品牌、 时速、 马力、 耗油量、 座椅数
1.2.4 消息与事件
什么是消息
➢消息是一个对象请求另一个对象执行其某种行 为操作(也称为方法)的规格说明。这种规格 说明总是由消息的接收者(提供方法的对象)、 消息
对象的特征
➢有一个特定的名字以区别于其他对象;
➢有一组属性,用来描述对象的静态特性;
➢有一组行为,用来描述对象的动态特性;
在面向对象的软件中:对象是可以用名字 标识的存储区域。对象的属性以固定或可 变数目的确定类型数值(或数值的集合) 的形式保存在该存储区域中,而实现一类 对象的行为的操作(代码)被保存在另外 相关的存储器区域中。
对象必然属于某一个类,且各有一个 名字,有不同的数据成员值,可以进 行相同的行为。
自行车类示例
3. 面向对象程序设计范型
① 程序的组成:类定义集合+主程序 类定义集合:每个类定义确定了一类对象的属性 和行为的创建规则,类定义之间具有层次结构。 主程序:创建所需要类的实例(对象),并在确 定的程序结构中进行对象之间的相互通讯,实现 程序所要完成的功能。 ② 程序的运行:各对象之间以消息(发送与接收) 的方式进行的通讯,实现对对象方法(行为的 执行)的调用。
2. 关于类(class)
类的定义
➢在客观世界中,类是对一组具有共同特性(属 性和行为)的客观事物的抽象概念。
➢在面向对象的软件中,类是由程序员自定义的 具有特定数据结构和建立数据结构上的操作功 能的抽象数据类型。
类与对象的关系
➢类是创建对象的模板,是对象的抽象,提供了 对象的构造规则。
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void main() { Father f ; f.testpublic() ; f.publicfun() ; // f.protectedfun() ; // f.privatefun() ; Son s ; s.testPublicInSon() ; s.testProtectedInSon() ; s.testPrivateInSon() ; }
当派生类与基类中有相同成员时:
若未强行指名,则通过派生类对象使用的是派 生类中的同名成员。 如要通过派生类对象访问基类中被覆盖的同名 成员,应使用基类名限定。
基类与派生类的对应关系
单继承
派生类只从一个基类派生。
派生类从多个基类派生。 由一个基类派生出多个不同的派生类。 派生类又作为基类,继续派生新的类。
}
17
int main() //主函数 { B0 b0; //声明B0类对象 B1 b1; //声明B1类对象 D1 d1; //声明D1类对象 B0 *p; //声明B0类指针 p=&b0; //B0类指针指向B0类对象 fun(p); p=&b1; //B0类指针指向B1类对象 fun(p); p=&d1; //B0类指针指向D1类对象 fun(p); }
面向对象程序设计三
屈卫兰
本章主要内容
类的继承
类成员的访问控制
单继承与多继承
派生类的构造、析构函数
类成员的标识与访问
继承
概念
Vehicle
Bicycle
Auto
ship
CarBusTru来自k类的继承与派生
保持已有类的特性而构造新类的过程称为继承。 在已有类的基础上新增自己的特性而产生新类 的过程称为派生。 被继承的已有类称为基类(或父类)。 派生出的新类称为派生类。
10
class Son : public Father { public: void testPublicInSon() { publicfun() ; } void testProtectedInSon() { protectedfun() ; } void testPrivateInSon() { // privatefun() ; } };
运行结果: B0::display() B0::display() B0::display()
18
继承时的构造函数
基类的构造函数不被继承,派生类中需要声 明自己的构造函数。 声明构造函数时,只需要对本类中新增成员 进行初始化,对继承来的基类成员的初始化, 自动调用基类构造函数完成。 派生类的构造函数需要给基类的构造函数传 递参数
单一继承时的构造函数
派生类名::派生类名(基类所需的形参,本类成员
所需的形参):基类名(参数表) { 本类成员初始化赋值语句; };
单一继承时的构造函数举例
#include<iostream> using namecpace std; class B{ public: B(); B(int i); ~B(); void Print() const; private: int b; };
#include "iostream.h" class A { public: A() { cout <<"in A construtor "<< endl ; } ~A(){ cout <<"in A destrutor "<< endl ; } void printA(){cout<<"Hello ";} }; class B {public: B() { cout <<"in B construtor "<< endl ; } ~B(){ cout <<"in B destrutor "<< endl ; } void printB(){cout<<"c++ ";} };
22
class C:public B { public: C(); C(int i,int j); ~C(); void Print() const; private: int c; };
23
C::C() { c=0; cout<<"C's default constructor called."<<endl; } C::C(int i,int j):B(i) { c=j; cout<<"C's constructor called."<<endl; } C::~C() { cout<<"C's destructor called."<<endl; } void C::Print() const { B::Print(); cout<<c<<endl; } int main() { C obj(5,6); obj.Print(); }
class Father : public GrandFather { public : void testpublic() { publicfun() ; cout << " publicVar = " << publicVar << endl ; cout << " protectedVar = " << protectedVar << endl ; // cout << " privateVar = " << privateVar << endl ; } protected: void testprotected() { protectedfun() ; } private: void testprivate() { // privatefun() ; } };
24
继承时的析构函数
析构函数也不被继承,派生类自行声明 声明方法与一般(无继承关系时)类的析 构函数相同。 不需要显式地调用基类的析构函数,系统 会自动隐式调用。 析构函数的调用次序与构造函数相反。
Extend.cpp
继承时的构造顺序及内存布局
父类先于子类构造
this
从Student继承的部分
11
私有继承(private)
基类的public和protected成员都以private身份 出现在派生类中,但基类的private成员不可直 接访问。 派生类中的成员函数可以直接访问基类中的 public和protected成员,但不能直接访问基类 的private成员。 通过派生类的对象不能直接访问基类中的任何 成员。
公有继承(public) 私有继承(private) 保护继承(protected)
三种继承方式
公有继承(public)
基类的public和protected成员的访问属性 在派生类中保持不变,但基类的private成 员不可直接访问。 派生类中的成员函数可以直接访问基类中 的public和protected成员,但不能直接访 问基类的private成员。 通过派生类的对象只能访问基类的public成 员。
B::B() { b=0; cout<<"B's default constructor called."<<endl; } B::B(int i) { b=i; cout<<"B's constructor called." <<endl; } B::~B() { cout<<"B's destructor called."<<endl; } void B::Print() const { cout<<b<<endl; }
protected 成员的特点与作用
对建立其所在类对象的模块来说,它与 private 成员的性质相同。 对于其派生类来说,它与 public 成员的性质相 同。 既实现了数据隐藏,又方便继承,实现代码重 用。
类型兼容规则
一个公有派生类的对象在使用上可以被当作基 类的对象,反之则禁止。具体表现在:
保护继承(protected)
基类的public和protected成员都以protected 身份出现在派生类中,但基类的private成员 不可直接访问。 派生类中的成员函数可以直接访问基类中的 public和protected成员,但不能直接访问基 类的private成员。 通过派生类的对象不能直接访问基类中的任何 成员
公有继承举例
class GrandFather { protected: public: void protectedfun() { GrandFather() { cout << "in GrandFather protectedfun() " << endl ; this->publicVar = 0 ; } this->protectedVar = 0 ; int protectedVar ; this->privateVar = 0 ; private: } void privatefun() { void publicfun() { cout << "in GrandFather cout << "in GrandFather privatefun() " << endl ; publicfun() " << endl ; } } int privateVar ; int publicVar ; };