浅析C++类的继承

开发 后端
在C++中,假如C++基类成员中的私有成员是别的类,但是对成员是不能访问的,在进行对C++基类进行操作时,需要很高的细心。

也许大家对与C++基类还不是很了解,看完本文后对您一定会大有帮助,下文除了学习C++基类的基本性质外还对C++基类的新特性进行全面研究,希望大家能够找到自己想要的东西。

基类中的公有成员在public派生时,不仅可以由派生类对象成员访问,也可以由外部函数访问;而在private派生时,C++基类中的公有成员虽然允许派生类对象中的成员访问,不允许外部访问。

可是再派生出下一级时,由于C++基类的所有成员已经被私有化,其它类成员也不可再访问。实现只许有派生血缘关系的对象成员访问的方法,是在基类中使用具有另一种访问属性的成员——protected成员。

protected成员是一种血缘关系内外有别的成员。它对派生对象而言,是公有成员,可以访问;对血缘关系外部而言,与私有成员一样被隐藏,此外,除了允许使用private与public两种派生方式之外。C++还允许使用protected派生方式。现在将三种访问属性不同的成员经三种派生后在派生类中访问属性的变化情况总结如下表,是对上一表格的增进和补充。

派生方式 基类的public成员 基类的protected成员 基类的private成员 派生方式引起的访问属性变化概括
private派生 变为private成员 变为private成员 不可见 基类中的非私有成员都成为派生类中的私有成员
protected派生 变为protected成员 变为private成员 不可见 基类中的非私有成员在派生类中的访问属性都降一级
public派生 仍为public成员 仍为protected成员 不可见 基类中的非私有成员在派生类中的访问属性保持不变

需要注意的是,C++基类的private成员无论经过何种派生,在派生类中都是不可见的。

(1)友元函数

通常,类的私有成员只能由本类的成员访问,外部函数只能访问类的成员函数,再由成员函数访问类的私有成员。但是,如果在某个类定义中用friend声明了一个外部函数(也许是其他类的一个成员)后,这个外部函数便可以例外地访问该类的任何私有成员。用friend声明了的外部函数称为这个类的友元函数。

当友元函数是另一个类的成员函数时,应当注意以下几点:

A:友元函数作为一个类的成员函数时,除应当在它所在的类定义中声明之外,还应当在另一个类中声明它的友元关系,声明语句的格式为:

friend 函数类型函数所在类名::函数名(参数列表);

B:友元函数在引用本类对象的私有成员时无需本类对象的引用参数,但在引用生命它是友元的类的对象中的私有成员时必须有友元类对象的引用参数。

C:一个类的成员函数作另一个类的友元函数时,必须先定义,而不是仅仅声明它。

使用友元函数直接访问对象的私有成员,可以免去再调用类的成员函数所需的开销。同时,友元函数作为类的一个接口,对已经设计好的类,只要增加一条声明语句,便可以使用外部函数来补充它的功能,或架起不同类对象之间联系的桥梁。然而,它同时也破坏了对象封装与信息隐藏,使用时需要谨慎小心。

(2)友元类

也可以把一个类而不仅仅是一个函数声明为另一个C++基类的友元类。这时,只需先声明它而不一定需要先定义。应当注意,友元关系是单向的,并且只在两个类之间有效。即使类X是类Y的友元。

类Y是否是类X的友元也要看类X中是否有相应的声明。即友元关系不具有交换性。若类X是类Y的友元,类Y是类Z的友元,也不一定就说明类X是类Z的友元,即友元关系也不具有传递性。当一个类要和另一个类协同工作时,使一个类成为另一个类的友元类是很有用的。这时友元类中的每一个成员函数都成为了对方的友元函数。

责任编辑:chenqingxiang 来源: NET130
相关推荐

2010-01-20 09:32:30

C++类

2010-01-19 10:04:30

C++类

2010-01-19 18:51:17

C++类

2010-02-02 13:41:01

C++类继承

2017-07-21 09:40:35

Python类、继承和多态

2010-01-21 09:34:57

C++语法

2010-01-27 16:05:06

C++堆栈

2010-01-27 17:16:52

C++构造函数

2010-01-20 10:19:55

C++数组

2010-01-26 14:35:11

C++关键字

2009-08-13 18:15:06

C#继承构造函数

2009-09-16 14:56:23

C++

2010-02-03 16:56:20

C++自定义类

2021-10-19 14:04:28

C++类型数字

2010-01-21 13:33:44

C++基类

2009-08-21 17:24:06

C# SingleIn

2009-08-06 14:43:10

C# Calculat

2009-08-21 17:24:06

C# SingleIn

2010-02-01 16:13:15

C++继承

2009-09-04 17:34:11

C#CC++
点赞
收藏

51CTO技术栈公众号