c++继承与protected
来源:互联网 发布:python 日期格式 编辑:程序博客网 时间:2024/05/22 06:50
继承是面向对象重要的特性,也较为复杂。继承主要的问题是:派生类对基类成员的访问权限。
private和public相信“众所周知”,public成员可以被类的对象、派生类成员访问,而private仅允许本类的成员函数访问。
本文主要解释protected:protected成员和protected继承。
protected成员:希望与派生类共享但拒绝外界直接访问的成员。
protected成员可以看作是public和private的中和体:
1. 具有private成员的一部分性质:不允许直接通过类的对象访问。
2. 具有public成员的一部分性质:派生类可以直接访问基类的protected成员。
当然当这两条性质是protected的最基本性质,但还存在另一条很重要的性质:
3. 派生类成员或友元不能访问基类对象的受保护成员,但可以访问派生类对象的受保护成员(当然公有成员也可以访问),且与继承方式无关。
注意这里强调用对象访问!
举个栗子:
class Base { protected: int i; private: int j; };class derive:public Base { public: int f(derive& s) { s.i = 0; //正确 可以在派生类中通过派生类对象访问基类的受保护成员 但基类私有成员不可访问 return i; } int f(Base& s) { s.i = 0; //错误 不能在派生类中访问基类对象的受保护成员 return i; } };
继承:
继承的过程:
1. 全盘接受基类的所有成员,但构造函数和析构函数除外。
2. 根据继承方式改变基类成员在派生类中的访问控制权限。
3. 同名覆盖。
4. 添加派生类独有的新成员。
要强调的是:所有继承方式(public,protected,private)不会影响派生类的访问权限,只会改变基类成员在派生类的访问属性。
也就是说,即使是private继承,派生类依然可以访问基类的public和protected成员,只不过原来基类的成员在派生类中变成了private属性。
仍然是刚才的例子:
class Base{public: int i;protected: int j;private: int k;};class derive:private Base{ //......};derive类使用了私有继承,但该类的成员函数依然可以访问Base类中的成员i和j,同时依然不能访问Base类中的成员k。
private继承和protected继承的区别:
在多重继承中能看出两者的区别,以两次继承为例:
第一次继承如果使用private继承,那么基类的所有成员在子类中均为private,第二次继承时无论何种继承方式,孙类成员函数都不能访问任何子类继承自基类的成员。
但如果第一次继承如果使用protected继承,基类public、protected成员在子类为protected,第二次继承时无论何种继承方式,孙类成员函数能访问子类继承自基类的public和protected成员。
举个栗子:
class Base{public: int i;protected: int j;private: int k;};class derive:protected Base{public: int m;};class re_derive :private derive //private继承不影响对基类public和protected成员的访问{public:void f(){ i = 0; j = 0; //由于第一次继承是protected继承 因此可以访问子类继承自基类的成员i,j //倘若第一次继承是私有继承 i,j将都不可访问}};
参考文献:
[1]Lippman,S.B. & Lajoie,J. & Moo,B.E.著; 王刚 & 杨巨峰译.C++ Primer中文版:第五版[M].北京:电子工业出版社,2013.9:542-544
- c++继承与protected
- C++:public继承、protected 继承、private继承
- C++:public继承、protected 继承、private继承
- 继承和Protected修饰符(C#)
- C++:类继承 private, protected的区别
- public、private、protected属性与public、private、protected继承
- public、private、protected属性与public、private、protected继承
- public、private、protected属性与public、private、protected继承
- 继承 Objective-C中public、protected、private的使用
- objective-c 与 protected public private关键字
- C++ public,protected,private继承与访问限制
- public,private,protected的区别,继承方法与访问权限
- 继承与访问修饰符public, protected, private
- 什么时候需要protected继承?
- protected 保护继承
- public、private、protected继承
- public、protected、private继承
- protected继承方式下
- hdu 4333(扩展KMP)
- IOS--聊天界面底部菜单栏
- 上位机与下位机程序配合是 下位机程序崩溃
- 浅谈线性表(一)【帆帆帆笔记系列】
- Python学习笔记
- c++继承与protected
- C语言实现N阶的2048小游戏
- 原生JS数组去重的几种方法
- 婚礼上的谎言(C语言)
- Linux远程连接工具 SSH (OpenSSH)
- 7. Reverse Integer
- Android studio 出现 Unsupported major.minor version 52.0
- 【BootStrap】图片样式、辅助类样式和CSS组件 -附源码
- C#进阶 04 变量