//b.f();//在类外不可以访问私有成员
b.g();//在类外可以访问公有成员
//b.k();//在类外不可以访问保护成员
}//====================================
voidmain()
{
}
从上面的实例中可以了解到以下信息:
在基类中对基类成员的访问能力
公有派生类对基类成员的访问能力
在类外对基类成员的访问能力
公有
√
√
√
保护
√
√
×
私有
√
×
×
那么如果是保护派生呢?
情况会怎么样?
通过程序的运行,可以知道与上述情况完全一样。
如果私有派生呢?
情况也一样,那到底有什么区别呢?
在多级派生中可以得到答案。
5.4.4多级派生时的访问属性
下图是一个典型的多级继承结构图,我们用程序来描述。
//例5.4多级派生的访问属性
classA//基类
{public:
inti;
protected:
voidf2();
intj;
private:
intk;
};
classB:
publicA//public方式
{public:
voidf3();
protected:
voidf4();
private:
intm;
};
classC:
protectedB//protected方式
{public:
voidf5();
private:
intn;
};
intmain()
{
return0;
}
我们用一个表格形式来看各成员在不同类中的访问情况:
成员
类
i
f2
j
k
f3
f4
m
f5
n
基类A
公有
√
保护
√
保护
√
私有
√
×
×
×
×
×
公有派生类B
公有
√
保护
√
保护
√
不可访问×
公有
√
保护
√
私有
√
×
×
保护派生类C
保护
√
保护
√
保护
√
不可访问×
保护
√
保护
√
不可访问×
公有
√
私有
√
如果是保护派生,访问情况如下表:
成员
类
i
f2
j
k
f3
f4
m
f5
n
基类A
公有
√
保护
√
保护
√
私有
√
×
×
×
×
×
保护
派生类B
保护
√
保护
√
保护
√
不可访问×
公有
√
保护
√
私有
√
×
×
保护派生类C
保护
√
保护
√
保护
√
不可访问×
保护
√
保护
√
不可访问×
公有
√
私有
√
如果是私有派生,访问情况如下表:
成员
类
i
f2
j
k
f3
f4
m
f5
n
基类A
公有
√
保护
√
保护
√
私有
√
×
×
×
×
×
私有
派生类B
私有
√
私有
√
私有
√
不可访问×
公有
√
保护
√
私有
√
×
×
保护派生类C
不可访问×
不可访问×
不可访问×
不可访问×
保护
√
保护
√
不可访问×
公有
√
私有
√
通过以上分析可知,无论是哪一种继承方式,在派生类中都不能访问基类中的私有成员,如果在多级派生时采用公用继承方式,直到最后一级派生类都能访问基类的公有成员和保护成员。
如果采用私有继承方式,经过若干派生后,基类的所有的成员都不可访问了。
如果采用保护继承方式,在派生类外是无法访问派生类中的任何成员的。
在经过多次派生后,人们很难记清楚各成员的访问情况,因此在实际应用中多采用公有继承。
//思考题:
阅读下列程序,画出访问情况表。
classA{
inti;
public:
voidf1();
protected:
voidf2();
};
classB:
publicA{
intm;
public:
voidf3();
intk;
};
classC:
protectedB{
intn;
public:
voidf4();
protected:
intm;
};
classD:
privateC{
intq;
public:
voidf5();
protected:
intp;
};
成员
类
i
f1
f2
B:
:
m
f3
k
n
f4
C:
:
m
q
f5
p
基类A
私有√
公有√
保护√
B公有继承
×
公有√
保护√
私有√
公共√
公共√
C保护继承
×
保护√
保护√
×
保护√
保护√
私有√
公共√
保护√
D私有继承
×
私有√
私有√
×
私有√
私有√
×
私有√
私有√
私有√
公共√
保护√
5.5派生类的构造函数和析构函数
在第3章中讲过,用户如果没有定义构造函数,C++会自动提供给我们一个默认的构造函数。
在定义类对象时会自动调用默认的构造函数。
基类的构造函数是不能继承的,所以在声明派生类时,不仅要考虑派生类所增加的数据成员的初始化,还要考虑基类的数据成员的初始化。
5.5.1简单的派生类中的构造函数
简单的派生只有一个基类,而且只有一级派生,在派生类的数据成员中不包含子对象(子对象问题在下面马上讲解)。
先来看一个最简单的实例。
//自编,是简单的继承。
隐含调用默认构造函数
#include
usingnamespacestd;
classA
{
public:
A(){cout<<"A"<};
classB:
publicA
{
public: