C++访问控制——公有、私有、保护继承
- 格式:wps
- 大小:258.00 KB
- 文档页数:5
C++访问控制
在C++中,类之间的继承关系有三种:公有继承、保护继承、私有继承,这三种继承有什么区别呢,首先看文字说明,然后举例说明:
公有继承:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问。也就是说基类的公有成员和保护成员被
继承到派生类中访问属性不变,仍作为派生类的公有成员和保护成员,派生类的其
他成员可以直接访问它们。在类族之外只能通过派生类的对象访问从基类继承的公
有成员。
私有继承:当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员的身份出现在派生类中,而基类的私有成员在派生类中不可直接访问。也就是说基类的
公有成员和保护成员被继承后作为派生类的私有成员,派生类的其他成员可以直接
访问它们,但是在类族外部通过派生类的对象无法直接访问它们。无论是派生类的
成员还是通过派生类的对象,都无法直接访问从基类继承的私有成员。
保护继承:保护继承中,基类的公有成员和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员变量不可直接访问。这样,派生类的其他成员就可以直接访问从
基类继承来的公有和保护成员,但在类的外部通过派生类的对象无法直接访问它们,无论是派生类的成员还是派生类的对象都无法直接访问基类的私有成员。
下面是一道软件设计师考试题:
已知3个类O、P、Q,类O中定义了一个私有方法F1、一个公有方法F2和一个保护的方法F3;类P和类Q是类O的派生类,其继承方式如下所示:
class P: protected O{...}
class Q: public O{...}
关于方法F1的描述正确的是(B)
A、方法F1无法被访问
B、只有在类O内才能访问方法F1
C、只有在类P内才能访问方法F1
D、只有在类Q内才能访问方法F1
关于方法F2的描述正确的是(C)
A、类O、P、Q的对象都可以访问方法F2
B、类P和Q的对象都可以访问方法F2
C、类O和Q的对象都可以访问方法F2
D、只有在类P内才能访问方法F2
关于方法F3的描述正确的是(B)
A、类O、P、Q的对象都可以访问方法F3
B、类O、P、Q的对象都不可以访问方法F3
C、类O和Q的对象都可以访问方法F3
D、类P和Q的对象都可以访问方法F3
我们按照题意编写如下代码(其中增加了一个私有继承的类R):
#include
using namespace std;
//在类O中分别定义了三个不同访问类型的函数class O{
public:
void F2();
private:
void F1();
protected:
void F3();
};
//类P保护继承于O
class P:protected O{
};
//类Q公有继承于O
class Q:public O{
};
//类R私有继承于O
class R:private O{
};
void O::F1()
{
cout<<"this is O's private function F1"< void O::F2() { cout<<"this is O's public function F2"< void O::F3() { cout<<"this is O's protected function F3"< //主函数 void main() { //下面用各个类的对象分别访问三个方法 P p; Q q; R r; o.F1();//① o.F2(); o.F3();//② p.F1();//③ p.F2();//④ p.F3();//⑤ q.F1();//⑥ q.F2(); q.F3();//⑦ r.F1();//⑧ r.F2();//⑨ r.F3();//⑩ } 编译后报错如下: 以上一共有10处错误,从上到下一次对应①——⑩,可以看出,如果用类的对象访问基类中的不同访问权限的方法时,只有基类O的对象o可以访问其本身的公有方法F2,派生类中,只有公有继承的类Q的对象q可以访问基类的公有方法F2,其余类的对象都无法访问基类的三个方法。 下面修改上面的代码,通过类内部去访问基类的不同权限的方法,代码如下: 注意:添加注释的地方为编译出错的地方。 #include using namespace std; //在类O中分别定义了三个不同访问类型的函数 class O{ public: void F2(); private: void F1(); void F3(); }; //类P保护继承于O class P:protected O{ public: /* void test_F1() { F1(); } */ void test_F2() { F2(); } void test_F3() { F3(); } }; //类Q公有继承于O class Q:public O{ public: /* void test_F1() { F1(); } */ void test_F2() { F2(); } void test_F3() { F3(); } }; //类R私有继承于O class R:private O{ public: /* void test_F1()