第6章 继承和派生类
vc++课件继承与派生
第6章 继承与派生
例: #include “iostream.h” class B1 {protected: int b1; public: B1(int val1) { b1=val1; cout<<”base1 is called “<<endl; } };
第6章 继承与派生
class B2 { protected: int b2; public: B2(int val2) { b2=val2; cout<<”base2 is called”<<endl; } };
第6章 继承与派生
class Bclass3 {public: Bclass3() {cout<<"constructor Bclass3\n";} ~Bclass3() {cout<<"deconstructor Bclass3\n";} };
格式一: class<派生类名>: private <基类名> { <派生新类定义成员> }; 格式二: class<派生类名>:<基类名> { <派生新类定义成员> };
第6章 继承与派生
3.保护基类
class<派生类名>: protected <基类名> { <派生新类定义成员> };
第6章 继承与派生
通过已有的类来产生新类的过程,称为 继承,也称为派生。
第6章 继承与派生
2.基类:在继承中,已有的类称为基类,又称 为父类。 3.派生类:在继承中,新产生的类称为派生类, 又称为子类。 4. 继承分类:单继承和多继承。 单继承:派生类只有一个直接基类称为单继承。 多继承:派生类有多个直接基类称为多继承。
vc06继承与派生
2010年11月17日1时51 分
《面向对象程序设计与Visual C++6.0教程》
22
使用派生类构造函数时应注意:
●当基类中没有显式定义构造函数时,派生 类的构造函数定义可以省略,系统采用默认 的构造函数。 ●当基类定义了具有形参的构造函数时,派 生类也必须定义构造函数,提供将参数传递 给基类构造函数的途径,使基类对象在进行 初始化时可以获得相关数据。 ●派生类构造函数的执行顺序: 先调用基类构造函数, 先调用基类构造函数,再调用内嵌成员 对象的构造函数(如果有内嵌成员对象) 对象的构造函数(如果有内嵌成员对象), 最后才执行派生类构造函数。 最后才执行派生类构造函数。 2010年11月17日1时51
2
6.1 继承与派生的概念
●继承是自然界的一个普遍的重要特性 。 继承是自然界的一个普遍的重要特性 ●派生使新类在继承共性的同时, 具有了 派生使新类在继承共性的同时, 派生使新类在继承共性的同时 更加丰富多彩的个性 。
2010年11月17日1时51 分
《面向对象程序设计与Visual C++6.0教程》
1.派生类的定义 1.派生类的定义
C++派生类的定义格式如下: class 派生类名:继承方式 基类名 派生类名: { 派生类新定义的数据成员; 派生类新定义的数据成员 派生类新定义的成员函数; 派生类新定义的成员函数 }
2010年11月17日1时51 分 《面向对象程序设计与Visual C++6.0教程》 9
继承方式
继承方式有三种: 继承方式有三种: public 公有继承 private 私有继承 protected 保护继承 缺省情况下表示private方式。 方式。 缺省情况下表示 方式
《继承与派生 》课件
目录
CONTENTS
• 继承与派生的基本概念 • 继承的方式 • 派生类的构造函数和析构函数 • 继承与多态 • 继承与重载
01
继承与派生的基本 概念
继承的定义
继承是面向对象编程中的一个重 要概念,它允许一个类(子类) 继承另一个类(父类)的属性和
方法。
通过继承,子类可以复用父类的 代码,减少代码冗余,提高代码
保护继承
总结词
保护继承是指基类的保护成员在派生类 中保持保护属性,可以被派生类和派生 类的对象访问。
VS
详细描述
保护继承时,基类的保护成员在派生类中 保持保护属性,可以被派生类和派生类的 对象访问。这种继承方式使得基类的保护 成员成为派生类的保护成员,可以被派生 类和派生类的对象访问。因此,派生类可 以继承基类的保护成员函数和变量。
03
派生类的构造函数 和析构函数
派生类的构造函数
派生类构造函数的作用
派生类构造函数用于初始化派生类对象,包括调用基类构造函数 和执行派生类特有的初始化操作。
派生类构造函数的执行顺序
派生类构造函数的执行顺序是在创建派生类对象时,先调用基类构 造函数,然后执行派生类构造函数体中的代码。
派生类构造函数的参数
继承和派生共同实现 了面向对象编程中的 代码复用和多态性。
派生是继承的一种表 现形式,通过派生可 以创建新的类。
02
继承的方式
公有继承
总结词
公有继承是ቤተ መጻሕፍቲ ባይዱ基类的公有成员在派生类中仍为公有成员,可以被派生类和派生类的对象访问。
详细描述
公有继承时,基类的公有成员在派生类中保持公有属性,派生类可以访问基类的公有和保护成员。这种继承方式 使得基类的公有成员成为派生类的公有成员,可以被派生类和派生类的对象直接访问,因此派生类可以继承基类 的公有成员函数和变量。
继承与派生类答案
继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握private,public,protected三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
总结-----c 之继承和派生
继承和派生一.继承(inheritance):在一个已存在的类的基础上建立一个新的类。
在c++中可重用性是通过继承这一机制实现的。
派生(derived):在已有类的基础上新增自己的特性而产生新类的过程。
共享基类的成员。
派生类不会继承基类的友元关系。
派生类同时也是一个组合:创建一个新类,类中的一个或者多个对象是其他类的成员。
被继承的类称为基类(base class),派生出的类称为派生类(derived class)。
一个派生类可以从一个基类派生,称之为单继承。
也可以从多个基类派生,称之为多继承。
派生过程基类不会作出改变。
派生类则除了继承基类所有可引用的成员外,还可以另外定义新的成员。
继承首先是代码重用的一种机制,但另一个重要的特性在于:继承描述了一组类,这组类在一个相关联的层次上,一个类可以看作是另一个类。
二.继承的目的:实现代码重用。
通过继承机制,可以利用已有的数据类型来定义新的数据类型。
派生的目的:当新的问题出现,原有程序无法解决时,对原有程序进行改造。
三.派生类的声明Class 派生类名:继承方式基类名{派生类新增加的成员声明;}派生类一部分是从基类继承的成员,一部分是在声明派生类时新增加的部分。
四.派生生成过程。
1.吸收基类成员:吸收除构造函数和析构函数外的数据。
2.改造基类成员:声明一个和基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员称之为同名覆盖。
这里的屏蔽或者覆盖并不是真正意义上的覆盖,依然可以通过基类名加作用域操作符(::)进行访问。
3.发展新成员:派生类新增加的成员。
新增加的成员需与基类成员不同命。
4.重写构造函数和析构函数:被重新定义的基类函数是虚函数,则称派生类中同名函数为重写。
派生类不会继承基类的构造函数和析构函数。
五.继承方式:继承方式不同影响派生类成员对基类成员访问权限。
1.Pubulic access(公有继承):派生类继承基类的public和protected 且访问属性不变。
《继承和派生》课件
派生类的析构函数
派生类析构函数在销毁派生类对象时 自动调用,用于释放派生类所占用的 资源。
派生类析构函数可以包含代码,用于 清理派生类所占用的资源。
派生类析构函数可以访问基类的析构 函数,通过使用`this`关键字调用基类 析构函数。
派生类析构函数可以重载基类析构函 数,以便在销毁派生类对象时执行特 定的操作。
基类析构函数的调用
在派生类的析构函数中,可以通过使用`this`关键字调 用基类的析构函数,以确保基类资源得到正确释放。
输标02入题
如果在派生类的析构函数中没有显式调用基类的析构 函数,则编译器会自动调用基类的默认析构函数。
01
03
在某些情况下,可能需要显式调用基类的析构函数, 以确保资源得到正确释放。例如,当基类包含动态分
02 继承的方式
公有继承
总结词
公有继承是指子类可以访问父类的公有成员。
详细描述
在公有继承中,子类可以访问父类的公有成员(即不加任 何修饰符的成员),这些成员在子类中保持公有属性。子 类可以继承和使用父类的公有成员,包括函数、变量、常 量等。
总结词
公有继承是实现代码复用的一种方式。
详细描述
通过公有继承,子类可以继承父类的公有成员,从而避免 重复编写相同的代码。这有助于提高代码的复用性和维护 性。
注意事项
虚函数和纯虚函数的使用 应合理规划,避免过度使 用导致程序复杂度和维护 成本增加。
继承和派生的效率问题
继承
通过共享已存在的代码, 减少代码冗余。但也可能 导致内存浪费和性能下降 。
派生
通过扩展已有类,增加新 功能或修改已有功能。但 也可能导致内存消耗增加 和性能下降。
注意事项
继承和派生
派生类构造函数调用顺序:
基类的构造函数;
子对象的构造函数;
派生类构造函数体;
二、派生类的析构函数
析构函数不能被继承; 执行派生类的析构函数时,基类的析构函数也 将被调用;
析构函数的执行顺序与构造函数严格相反;
派生类的析构函数; 基类的析构函数;
[例]分析下列程序
#include <iostream.h> class B B::~B() {public: { cout<<"B's destructor called. "<<endl; } B(); void B::Print() const B(int i); { cout<<b<<endl; } ~B(); void Print() const; private: int b; }; B::B() { b=0; cout<<"B's default constructor called. "<<endl;} B::B(int i) { b=i; cout<<"B's constructor called. "<<endl; }
回答下列问题,并说明原因。
1、派生类B中成员函数f2()能否访问基类A的成员:f1()、j1和i1? 可以访问f1()和j1,不可以访问i1; 2、能否通过派生类B的对象b访问基类A成员:f1()、j1和i1? 可以访问f1(),不可以访问j1和i1; 3、派生类C的成员函数f3()能否访问直接基类B的成员f2()、j2 和i2?能否访问间接基类A的成员: f1()、j1和i1? 可以访问直接基类中的f2()和j2以及间接基类中的f1()和j1, 不可以访问i2和i1; 4、能否通过派生类C对象c访问直接基类B中的成员:f2()、j2和i2? 能否访问间接基类A中的成员: f1()、j1和i1?
C++笔记(6-10)
C++笔记(6-10)第六章继承和派⽣§6.1 继承和派⽣的概念⼀、派⽣原有的类称为基类,新产⽣的类称为派⽣类,派⽣类继承了基类所有的数据成员和成员函数。
派⽣类使⽤两种基本的⾯向对象技术,⼀种称为性质约束,即对基类的性质进⾏限制;另⼀种称为性质扩展,即增加派⽣类的性质。
相对基类,派⽣类可以有以下变化:增加新的成员;重新定义已有的成员函数;改变基类成员的访问权限。
⼆、继承⽽不是构成关系。
C++派⽣类可以有多个基类。
§6.2 单⼀继承⼀、单⼀继承的⼀般声明形式private:成员声明列表protected:成员声明列表public:成员声明列表};其中,访问控制是指如何控制基类成员在派⽣类中的访问属性,它是关键字private、protected和public中的⼀个,声明中的其余部分和类的声明类似。
⼆、派⽣类的构造函数和析构函数1冒号后“基类名(参数表)”称为成员初始化列表,参数表给出所调⽤的基类构造函数所需要的实参,实参的值可来⾃“参数表0”,也可由表达式给出。
2构造函数和析构函数也都可在类体内直接定义为内联函数,这时的定义形式需把上述定义式中的“派⽣类名::”去掉。
例1:使⽤默认内联函数实现单⼀继承#includeusing namespace std;class Point{private:int x,y;public:Point(int a,int b){x=a;y=b;cout<<"点"<<””;}void Showxy( ){cout<<"x="<~Point( ){cout<<"删除点"<<””;}};private:int H,W;public://构造函数初始化列表void Show( ){cout<<"H="<};void main(){Rectangle r1(3,4,5,6); //⽣成派⽣类对象r1,r1先后调⽤基类和派⽣类的构造函数进⾏初始化派⽣对象调⽤基类的成员函数,派⽣对象调⽤派⽣类的成员函数}程序运⾏结果:点矩形 x=3,y=4 H=5,W=6 删除矩形删除点3、⼩结⾸先调⽤基类的构造函数,对基类成员进⾏初始化,然后执⾏派⽣类的构造函数,如果某个基类仍是⼀个派⽣类,则这个过程递归进⾏。
《继承和派生》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
继承的例子
• 家具和柜子 • 建筑和房子 • 道路和高速公路 • 动物和猫 • 电视和彩色电视 • 电脑和笔记本电脑
【优秀文档】继承与派生PPT
• 派生类新增成员函数和外部函数(普通和类外函数)不 能直接访问继承过来的基类私有成员;但可以通过继承 过来的基类的公有成员函数或保护成员函数进行访问。
• 例见备注页
私有继承private
• 派生类中的公有成员仅为新定义部分的公有成员,保护 成员也仅为新定义部分的保护成员,私有成员包括基类 部分的公用成员和保护成员以及新定义部分的私有成员 。 派生类成员可以直接访问;
• 在派生类外部,派生类对象,外部函数(普通和类外函 数)不能直接访问私有继承过来的基类的公有成员和保 护成员;但可以通过派生类的公有成员函数进行访问。
• 派生类新增成员和对象,外部函数(普通和类外函数) 不能直接访问继承过来的基类私有成员;但可以通过私 有继承过来的基类的公有成员函数和保护成员函数间接 访问继承过来的基类的私有成员。
派生类的定义格式
class 派生类名:继承方式 基类1,继承方式 基类2, …,继承方式 基类n
{ 派生类成员定义; }; 注意: • 每一种继承方式只限定紧跟其后的基类的访问性质
。 • 继承方式的缺省方式是私有继承(private)。 • 继承方式的不同决定了对基类成员的访问性质。
公有继承public
继承与派生
基本概念
• 派生与继承 • 直接基类与间接基类 • 单继承与多继承 • 派生类成员 • 派生类对基类的继承方式
派生与继承
• 在原有类的基础上创建新类的过程称为原有类派生 出新类,简称派生;
• 新类的特征(数据成员)和功能(成员函数)中保 留原有类的一些特征和功能的性质称为新类对原有 类的继承,简称继承。
面向对象程序设计语言C++第06章 继承和派生
void main() { A objA; objA.set_priA(1); objA.set_pubA(2); objA.out_priA(); B objB; objB.set_priA(3); objB.set_pubA(4); objB.set_priB(5); objB.set_pubB(6); objB.out_priA(); objB.out_B(); } • 程序输出为: 13456
猿科
猫科
熊猫
野猫
家猫
动物分类层次图
4
第六章 继承和派生 •6.1派生类的概念
6.1.1为什么要使用继承 为什么要使用继承 在最简单的情况下,一个类B继承类A或者从类A 派生类B,通常将类A称为基类(父类),类B称为派 生类(子类)。 这时,类B的对象具有类A对象的所有特性,甚至 还会更多一些。 也可以这样说,类B从类A派生出来。这意味着类 B至少描述了与类A同样的接口,至少包含了同类A 一样的数据,可以共享类A的成员函数。
25
第六章 继承和派生 • 6.1派生类的概念
6.1.2 派生类的声明和继承方式 访问声明的形式为: (1)基类类名::基类保护段或公有段数据成员; (2)基类类名::基类保护段或公有段成员函数名;
class B { int a; public: public: int b; void f(); }; class D : private B { int d; public: public: B::b; B::f; int c; };
9
这种继承和派生机制对于已有程序的扩展 和改进是极为有力的。 可以描述基类和派生类的关系为: 派生类是基类的具体化, 基类是派生类的抽象。 即基类综合了派生类的公共特征,派生类 则在基类的基础上增加了某些特征,把抽象 类变成具体的、实用的类型。
C++ 第6章继承和派生类
A
a2
i1 k1
B的子对象a2 的数据成员 B 的 数 据 B的子对象a1 成 的数据成员 员 C 的 数 据 成 员
A
i1 k1
C
B
a1
i1 A k1
B的直接基类 A的数据成员
6.3 派生类的构造函数与析构函数
1.派生类构造函数 1)说明
基类的构造函数不被派生类继承。 创建派生类对象时,自动调用基类构造函
void print(){cout<<"a="<<a<<",";} int Geta(){return a;} private: int a; }; class Derived:public Base { private: int b; Base Ba; //子对象 public: Derived(){b=0;cout<<"Derived缺省构造函数\n";} Derived(int i,int j,int k):Base(i), Ba(j),b(k) { cout<<"Derived构造函数\n";} void print(){ //同名覆盖 Base::print(); //调用基类Base的print()函数 cout<<"b="<<b<<",Ba.a="<<Ba.Geta()<<endl; } };
第六章 继承和派生类
本章内容
继承性、基类和派生类的基本概念
派生类的定义和派生类对象的组成
派生类的构造函数和析构函数
赋值兼容规则
重点:掌握派生类的定义和派生类对象的组成; 派生类的构造函数和析构函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
class B { public: int i; protected: int j; private: int k; };
class A: public B { public: void display() { cout << i << endl; // can access it cout << j << endl; // can access it cout << k << endl; // Wrong, cannot access it } };
49
子对象的初始化
如果一个类含有子对象,创建对象时不仅要对本 类的基本类型数据成员初始化,而且也要对子对 象进行初始化。 含子对象类的构造函数的形式是: 构造函数名( 形参表 ):数据成员初始化表 { 函数体 }
子对象成员所需的形参,本类成员所需的形参
子对象初始化表[,本类基本类型数据成员初始化表]
class Line { private: Point p1 , p2; //线段的两个端点 int color; //线段的颜色 public: Line( ) { color = 0;} // 默认构造函数 Line(float x1, float y1, float x2, float y2, int c); // 构造函数 void drawline( ) { //画出线段 p1.drawpoint(); p2.drawpoint(); cout<<"颜色"<<color<<endl; } }; Line::Line(float x1, float y1, float x2, float y2, int c): p2(x2, y2), p1(x1, y1), color(c){ } void main( ){ Line line(1, 2, 5, 6, 3); line.drawline();
Square
组合 Example
组合表达 “hasa”or“usesa”关系
Wheel
air() roll( )
Door
open() close()
Engine
start() rev() stop()
Car
move()
class wheel { public: void air(); void roll(){cout<<" 车轮转动 ";} }; class door { public: void open(); void close(); }; class engine { public: void start(); void rev(); void stop(); };
Circle
draw ( ) get/set ( ) location color filled radius
Square
draw ( ) get/set ( ) location color filled
height width
继承的目的
扩充和完善原有程序以适应新的需求 当新的问题出现,原有程序无法解决 (或不能完全解决)时,需要对原有程 序进行改造。 实现代码复用,减少代码和数据的冗余 度,提高软件开发的效率。
继承方式
protected
private 不可直接访问 不可直接访问
public protected
public protected
protected protected
private
private
private
不可直接访问
公有继承
基类的public和protected成员的访问属性在派生类 中保持不变,但基类的private成员不可直接访问。 派生类中的成员函数可以直接访问基类中的public 和protected成员,但不能直接访问基类的private成 员(只能通过基类的公有成员函数访问) 。 通过派生类的对象只能访问基类的public成员。 派生类本身的成员遵循通用的访问控制策略 继承体现了封闭性和开放性的结合
使用 Protected
class Circle : public Point { class Point { public: public: Point( int = 0, int = 0 ); Circle( int x=0, int y=0, double r =0.0); void setPoint(int, int); void setRadius( int r ); void print(); private: protected: double radius; int x, y; }; };
不同继承方式的影响主要体现在:
•派生类成员对基类成员的访问权限 •通过派生类对象对基类成员的访问权限
protected(保护继承)
定义派生类的格式
class Circle : public Point class Point { { public: public: Point( int = 0, int = 0 ); Circle( int x=0,int y=0,double r =0.0); void setPoint(int, int); void setRadius( int r ); void print(); private: protected: double radius; int x,y; }; };
继承举例
Person
breath( ) eat( )
Student
breath( ) eat( ) study( )
CppStudent
breath( ) eat( ) study( ) writeCode( )
继承举例
Shape
draw ( ) get/set ( ) location color filled
Every car is a wheeled vehicle.
3
继承与派生问题举例
雇员
技术人员
管理人员
销售人员
销售经理
类的继承与派生
保持已有类的特性而构造新类的过程称为继承。 在已有类的基础上新增自己的特性而产生新类的过 程称为派生。 被继承的类称为基类 base class(或父类parent class)。 派生出的新类称为派生类 derived class(子类child class)。 新的类不仅具有基类的特征(数据和行为 ) ,即 继承了基类的数据和函数,而且还可以添加新的特 征,同时能够继续被继承而派生出新的类。 继承的本质是创建新的类。
public
public
protected
不同继承方式下基类与派生类的特性
public
继承方式
protected
private 不可直接访问 不可直接访问
public protected
public protected
protected protected
不同继承方式下基类与派生类的特性
public
第六章 继承和派生类
本章内容
继承( Inheritance )与派生、基类和派 生类的基本概念 派生类的定义和派生类对象的组成 派生类的构造函数和析构函数 赋值兼容规则
交通工具之间的继承层次结构
vehicle
wheeled vehicle
boat
car
bicycle
two-door
four-door
void main() { A a; cout << a.i << endl; // Fine, can access it cout << a.j << endl; // Wrong, cannot access it cout << a.k << endl; // Wrong, cannot access it }
25
protected 成员的特点与作用
对建立其所在类对象的模块来说,它与 private 成员的性质相同。 对于其派生类来说,它与 public 成员的 性质相同。 既实现了数据隐藏,又方便继承,实现 代码重用。
不同继承方式下基类与派生类的特性
public
继承方式
protected
private 不可直接访问
protected 成员举例
class A { protected: int x; }; void main() { A a; a.x=5; //错误 }
protected 成员举例
class A { protected: int x; }; class B: public A{ public: void function() { x = 5; //正确 } };
子 对 象 初 始 化 举 例
class A { 隐式调用B( ) public: A(){ x = 0; cout << "A class( x=0)\n"; } A( int i , int j , int k ) : bb( i , j ) , x( k ){ cout << "A class( x=" << x <<")\n"; } void print(){ cout << "x=" << x; bb.print(); } private: i private: float x , y; //点的坐标 public: Point() { //默认构造函数 x = 0; y = 0; } Point( float x1 , float y1 ) //构造函数 { x = x1; y = y1; } void drawpoint( ) { cout<< "画点(" << x << "," << y << ")"; } };