博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++:公有继承、私有继承和保护继承
阅读量:4109 次
发布时间:2019-05-25

本文共 2688 字,大约阅读时间需要 8 分钟。

在C++中有三种继承方式:公有继承(public)、私有继承(private)和保护继承(protected)。

1. 公有继承(public)

公有继承:基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

2. 私有继承(private)

私有继承:基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。 

3. 保护继承(protected)

保护继承:基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

下表列出三种不同继承方式的基类特性和派生类特性。

public          
protected     private         
公有继承 public protected 不可见
私有继承 private private 不可见
保护继承 protected protected 不可见

从表中可以作如下总结:

1) 基类成员对派生类而言:公有和保护成员是可见的,私有成员是不可见的。

2) 基类成员对派生类对象而言:要看基类的成员在派生类中变成了什么类型的成员。如:私有继承时,基类的公有成员和保护成员都变成了派生类中的私有成员,因此对于派生类的对象来说,基类的共有成员和保护成员是不可见的。

为了进一步理解三种不同的继承方式在其成员的可见性方面的区别,下面从三种不同角度进行讨论。

公有继承

(1) 基类成员对其对象的可见性:

公有成员可见,其他成员不可见。这里保护成员同于私有成员。

(2) 基类成员对派生类的可见性:

公有成员和保护成员可见,私有成员不可见。这里保护成员同于公有成员。

(3) 基类成员对派生类对象的可见性:

公有成员可见,其他成员不可见。

所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。这里,一定要区分清楚派生类的对象派生类中的成员函数对基类的访问是不同的。

私有继承

(1) 基类成员对其对象的可见性:

公有成员可见,其他成员不可见。

(2) 基类成员对派生类的可见性:

公有成员和保护成员可见,私有成员不可见。

(3) 基类成员对派生类对象的可见性:

所有成员都不可见。

所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。

保护继承

这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,对基类成员有不同的可见性。

using namespace std;//class Base       //父类{private:    int privatedateA;protected:    int protecteddateA;public:    int publicdateA;};//class Derive1 : public Base      //基类Base的派生类Derive1 (公有继承){public:    void funct()    {        int b;        //! b = privatedateA;   //error:基类中私有成员在派生类中是不可见的        b = protecteddateA;     //ok:基类的保护成员在派生类中为保护成员        b = publicdateA;        //ok:基类的公共成员在派生类中为公共成员    }};//class Derive2 : private Base  //基类Base的派生类Derive2(私有继承){public:    void funct()    {        int c;        //! c = privatedateA;    //error:基类中私有成员在派生类中是不可见的        c = protecteddateA;      //ok:基类的保护成员在派生类中为私有成员        c = publicdateA;         //ok:基类的公共成员在派生类中为私有成员    }};//class Derive3 : protected Base   //基类Base的派生类Derive3(保护继承){public:    void funct()    {        int d;        //! d = privatedateA;   //error:基类中私有成员在派生类中是不可见的        d = protecteddateA;     //ok:基类的保护成员在派生类中为保护成员        d = publicdateA;        //ok:基类的公共成员在派生类中为保护成员    }};//int main(){    int a;      Derive1 obj1;    //! a = obj1.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见    //! a = obj1.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见    a = obj1.publicdateA;        //ok:基类的公共成员在派生类中为公共成员,对对象可见     Derive2 obj2;    //! a = obj2.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见    //! a = obj2.protecteddateA; //error:基类的保护成员在派生类中为私有成员,对对象不可见    //! a = obj2.publicdateA;    //error:基类的公共成员在派生类中为私有成员,对对象不可见     Derive3 obj3;    //! a = obj3.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见    //! a = obj3.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见    //! a = obj3.publicdateA;    //error:基类的公共成员在派生类中为保护成员,对对象不可见     return 0;}
 

转载地址:http://kvtsi.baihongyu.com/

你可能感兴趣的文章
openstack虚拟机创建流程
查看>>
Android中AsyncTask的简单用法
查看>>
Jenkins 启动命令
查看>>
剑指offer算法题分析与整理(三)
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Java8 HashMap集合解析
查看>>
自定义 select 下拉框 多选插件
查看>>
fastcgi_param 详解
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
MODULE_DEVICE_TABLE的理解
查看>>
db db2_monitorTool IBM Rational Performace Tester
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
乘法逆元
查看>>
Objective-C 基础入门(一)
查看>>
Flutter Boost的router管理
查看>>
iOS开发支付集成之微信支付
查看>>
C++模板
查看>>