C++类继承关系中访问控制之变化
bauldeng 4/1/2006
根据C++语法规则,以及在MS VC++6.0中的例子试验,可以得出如下结论。
1. B从A public继承
A之public区=>B之public区;
A之protected区=>B之protected区;
A之private区对B不可见;
2. B从A private继承
A之public区=>B之private区;
A之protected区=>B之private区;
A之private区对B不可见;
3. B从A protected继承 (比较少见!)
A之public区=>B之protected区;
A之protected区=>B之protected区;
A之private区对B不可见。
这里,
1) A, B是两个C++类,B从A继承而来,换言之,A是基类,B是派生类;
2) public区意味着声明为public访问权限的数据成员和成员函数,
protected区、private区的含义依此类推;
3)“=>”表示“继承为”或者“转变为”。
以上规则1和2两点,比较有把握;对于3,资料较少,不知道是不是C++的普遍规则,还是与具体的C++编译器有关?
附记:
水平访问:声明了某类的一个对象,访问其成员函数和数据成员;一般只有public区(不含protected区!)的成员函数和数据成员,可以被水平访问。
垂直访问:一个类从某个基类派生,派生类访问基类的成员函数和数据成员;一般只有public和protected区的成员函数和数据成员,可以被垂直访问。
例题:
已知3个类O、P和Q,类O中定义了一个私有方法F1、一个公有方法F2和一个受保护的方法F3:类P和类Q是类O的派生类,其继承方式如下所示:
class P : protected O {…};
class Q : public O {…};
关于方法F1的描述中正确的是___(34)___;关于方法F2韵描述中正确的是___(35)___;关于方法F3的描述中正确的是___(36)___。
(34)A.方法F1无法被访问 B.只有在类O内才能访问方法F1
C.只有在类P内才能访问方法F1 D.只有在类Q内才能访问方法F1
(35)A.类O、P和Q的对象都可以访问方法F2 B.类P和Q的对象都可以访问方法F2
C.类0和Q的对象都可以访问方法F2 D.只有在类P内才能访问方法F2
(36)A.类0、P和Q的对象都可以访问方法F3 B.类0、P和Q的对象都不可以访问方法F3
C.类0和Q的对象都可以访问方法F3 D.类P和Q的对象都可以访问方法F3。
看看你能否解释一下这几个问题的答案。BCB
bauldeng 4/1/2006
根据C++语法规则,以及在MS VC++6.0中的例子试验,可以得出如下结论。
1. B从A public继承
A之public区=>B之public区;
A之protected区=>B之protected区;
A之private区对B不可见;
2. B从A private继承
A之public区=>B之private区;
A之protected区=>B之private区;
A之private区对B不可见;
3. B从A protected继承 (比较少见!)
A之public区=>B之protected区;
A之protected区=>B之protected区;
A之private区对B不可见。
这里,
1) A, B是两个C++类,B从A继承而来,换言之,A是基类,B是派生类;
2) public区意味着声明为public访问权限的数据成员和成员函数,
protected区、private区的含义依此类推;
3)“=>”表示“继承为”或者“转变为”。
以上规则1和2两点,比较有把握;对于3,资料较少,不知道是不是C++的普遍规则,还是与具体的C++编译器有关?
附记:
水平访问:声明了某类的一个对象,访问其成员函数和数据成员;一般只有public区(不含protected区!)的成员函数和数据成员,可以被水平访问。
垂直访问:一个类从某个基类派生,派生类访问基类的成员函数和数据成员;一般只有public和protected区的成员函数和数据成员,可以被垂直访问。
例题:
已知3个类O、P和Q,类O中定义了一个私有方法F1、一个公有方法F2和一个受保护的方法F3:类P和类Q是类O的派生类,其继承方式如下所示:
class P : protected O {…};
class Q : public O {…};
关于方法F1的描述中正确的是___(34)___;关于方法F2韵描述中正确的是___(35)___;关于方法F3的描述中正确的是___(36)___。
(34)A.方法F1无法被访问 B.只有在类O内才能访问方法F1
C.只有在类P内才能访问方法F1 D.只有在类Q内才能访问方法F1
(35)A.类O、P和Q的对象都可以访问方法F2 B.类P和Q的对象都可以访问方法F2
C.类0和Q的对象都可以访问方法F2 D.只有在类P内才能访问方法F2
(36)A.类0、P和Q的对象都可以访问方法F3 B.类0、P和Q的对象都不可以访问方法F3
C.类0和Q的对象都可以访问方法F3 D.类P和Q的对象都可以访问方法F3。
看看你能否解释一下这几个问题的答案。BCB