前言


  无论是在平时学习中还是还做项目之时,主要用到的继承都是 public 公有继承,因此,对protected private两者继承都不大了解!

  今天,在看《Effective C++ 3e》 Item6 时,发现下面这个私有继承:

class Uncopyable
{
protected:
Uncopyable() {}
~Uncopyable() {} private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
}; class HomeForSale: private Uncopyable
{
...
};

  在该例子当中,主要是想表现HomeForSale类对象不能拷贝、不能赋值,因此,需要将其copy constructor 与 copy assignment operator 定义为私有,不能被 类使用者拷贝和赋值。

  那么,到底公有继承、私有继承、保护继承它们之间到底是怎么样的呢?下面我们详细分析一下:

概述


公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。

1. 公有继承(public)

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

2. 私有继承(private)

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

3. 保护继承(protected)

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

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

基类属性

public

protected

private

After 公有继承

public

protected

不可见

After 私有继承

private

private

不可见

After 保护继承

protected

protected

不可见

  结论:

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

  所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。

  这里,一定要区分清楚派生类的对象和派生类中的成员函数对基类的访问是不同的。

  最后,看下面代码,从而,验证上述理论:

#include<iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////
class A //父类
{
private:
int privatedataA;
protected:
int protecteddataA;
public:
int publicdataA;
}; //////////////////////////////////////////////////////////////////////////
class B :public A //基类A的派生类B(共有继承)
{
public:
void funct()
{
int b;
b = privatedataA; //error:基类中私有成员在派生类中是不可见的
b = protecteddataA; //ok:基类的保护成员在派生类中为保护成员
b = publicdataA; //ok:基类的公共成员在派生类中为公共成员
}
}; //////////////////////////////////////////////////////////////////////////
class C :private A //基类A的派生类C(私有继承)
{
public:
void funct()
{
int c;
c = privatedataA; //error:基类中私有成员在派生类中是不可见的
c = protecteddataA; //ok:基类的保护成员在派生类中为私有成员
c = publicdataA; //ok:基类的公共成员在派生类中为私有成员
}
}; /////////////////////////////////////////////////////////////////////////
class C1: public C
{
public:
void fun()
{
int c1;
c1 = protecteddataA; //error: 基类中私有成员在派生类中是不可见的
c1 = publicdataA; //error: 基类中私有成员在派生类中是不可见的
}
}; //////////////////////////////////////////////////////////////////////////
class D :protected A //基类A的派生类D(保护继承)
{
public:
void funct()
{
int d;
d=privatedataA; //error:基类中私有成员在派生类中是不可见的
d=protecteddataA; //ok:基类的保护成员在派生类中为保护成员
d=publicdataA; //ok:基类的公共成员在派生类中为保护成员
} }; //////////////////////////////////////////////////////////////////////////
class D1: public D
{
public:
void func()
{
int d1;
d1 = protecteddataA; //ok! 基类的保护成员在派生类中为保护成员
d1 = publicdataA; //ok! 基类的保护成员在派生类中为保护成员
}
}; //////////////////////////////////////////////////////////////////////////
int main()
{
int a; B objB;
a = objB.privatedataA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
a = objB.protecteddataA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
a = objB.publicdataA; //ok:基类的公共成员在派生类中为公共成员,对对象可见 C objC;
a = objC.privatedataA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
a = objC.protecteddataA; //error:基类的保护成员在派生类中为私有成员,对对象不可见
a = objC.publicdataA; //error:基类的公共成员在派生类中为私有成员,对对象不可见 D objD;
a = objD.privatedataA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
a = objD.protecteddataA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
a = objD.publicdataA; //error:基类的公共成员在派生类中为保护成员,对对象不可见 return ;
}

C++继承:公有,私有,保护的更多相关文章

  1. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  2. 公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  3. 【转】c++继承:公有、私有、保护

    原文链接:http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html 公有继承(public).私有继承(private).保护继承(pro ...

  4. c++继承详解:共有(public)继承,私有继承(private)继承,保护(protected)继承

    公有继承(public)继承.私有继承(private).保护继承(protected)是常用的三种继承方式. 1.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时 ...

  5. C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承

    公有继承(public).私有继承(private).保护继承(protected)是常用的三种继承方式. 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时, ...

  6. C++ 继承方式 //语法:class 子类 :继承方式 父类 //继承方式 三种: //1.公共继承 //2.保护继承 //3.私有继承

    1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 #include <ios ...

  7. C++中公有继承、保护继承、私有继承的区别

    公有继承时基类中各成员属性保持不变,基类中private成员被隐藏.派生类的成员只能访问基类中的public/protected成员,而不能访问private成员:派生类的对象只能访问基类中的publ ...

  8. C++公有继承、保护继承和私有继承

    C++中的继承方式有: public.private.protected三种(它们直接影响到派生类的成员.及其对象对基类成员访问的规则). (1)public(公有继承):继承时保持基类中各成员属性不 ...

  9. C++ 公有继承、保护继承和私有继承的对比

    在c++的继承控制中,有三种不同的控制权限,分别是public.protected和private.定义派生类时,若不显示加上这三个关键字,就会使用默认的方式,用struct定义的类是默认public ...

  10. c++ 多继承 公有,私有,保护

    昨天学习三种继承方式,有些比喻十分形象,特此分享. 首先说明几个术语: 1.基类 基类比起它的继承类是个更加抽象的概念,所描述的范围更大.所以可以看到有些抽象类,他们设计出来就是作为基类所存在的(有些 ...

随机推荐

  1. php微信支付接口开发程序

    php微信支付接口开发程序讲解 微信支付接口现在也慢慢的像支付宝一个可以利用api接口来实现第三方网站或应用进行支付了, 下文整理了一个php微信支付接口开发程序并且己测试,有兴趣的朋友可进入参考. ...

  2. 微信JS-SDK实际分享功能

    为了净化网络,整顿诱导分享及诱导关注行为,微信于2014年12月30日发布了<微信公众平台关于整顿诱导分享及诱导关注行为的公告>,微信平台开发者发现,原有的微信分享功能不能用了,在ipho ...

  3. impress.js学习总结

    impress.js是一个很有趣的用来替代PPT的展示用的js工具,它的灵感来自prezi 如果你要学习使用它,这里有很好的演示模板 使用它的第一步,下载 impress.js,引入到你的代码里,并执 ...

  4. python进度条代码

    import sys import time def view_bar(num,total): rate = num / total rate_num = int(rate * 100) r = ' ...

  5. 【转】app后端如何选择合适的数据库产品

    转自:http://blog.csdn.net/newjueqi/article/details/44003503 app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis ...

  6. Java高阶面试问题合集

    下面总结一下在Java面试中常用的一些问题,不具体解答,我只附上一些精彩的博文链接. Spring IOC AOP 底层原理 JAVA的反射机制和动态代理 Java反射机制和动态代理 多线程 Spri ...

  7. MAC——laravel环境

    apache: 目录:etc/apache2 重启:sudo apachectl restart PHP: 把/etc/php.ini.default复制并重命名/ect/php.ini 打开Load ...

  8. 隐藏 response headers

    1.response headers 为何物 从上图看到..这 透漏出服务器端 1.操作系统版本, IIS版本.开发语言 .以及.net framework 版本 虽然现在IIS 可以挂php .甚至 ...

  9. 【Linux】常用命令-统计代码行数

    公司人员流动大,经常有新的维护任务,交接时喜欢看看新来的模块的代码量,那么问题来了, 如何统计代码行数? 1,最先想到的肯定是 wc. wc -l *.h 将查看[当前目录]下头文件的代码行数,输出结 ...

  10. ubuntu 解压rar

    Ubuntu下解压rar文件的方法 一般通过默认安装的ubuntu是不能解压rar文件的,只有在安装了rar解压工具之后,才可以解压.其实在ubuntu下安装rar解压工具是非常简单的,只需要两个步骤 ...