精华内容
下载资源
问答
  • 在保护继承中基类的共有成员
    千次阅读
    2019-03-01 16:05:43

    基类:public; protect; private;

    派生类公有继承基类:public; protect; 不可访问;

    派生类私有继承基类:private; private; 不可访问;

    公有继承的情况下,基类的public,protect成员的属性在派生类中保持不变,private成员的属性变为不可访问即派生类只能通过基类的成员函数访问基类的私有成员。

    私有继承的情况下,基类的public,protect成员的属性在派生类中变成私有,private成员的属性变为不可访问即派生类只能通过基类的成员函数访问基类的私有成员。

    更多相关内容
  • C++继承:公有,私有,保护

    千次阅读 2021-01-14 06:59:56
    from:http://blog.csdn.net/crayondeng/article/details/144985391. 公有继承(public)公有继承的特点是基类的...2. 私有继承(private)私有继承的特点是基类的公有成员保护成员都作为派生类的私有成员,并且不能...

    from: http://blog.csdn.net/crayondeng/article/details/14498539

    1. 公有继承(public)

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

    2. 私有继承(private)

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

    3. 保护继承(protected)

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

    下面列出三种不同的继承方式的基类特性和派生类特性:基类不同特性(public ,protected,private)的成员在公有,私有,保护继承下,派生类中,对这些成员的访问特性。

    比如说:

    在公有继承下,基类中public的成员,在派生类中的访问特性变成是public;

    基类中protected的成员,在派生类中的访问特性变成是protected;

    基类中private的成员,在派生类中的访问特性变成是不可见。

    public

    protected

    private

    公有继承

    public

    protected

    不可见

    私有继承

    private

    private

    不可见

    保护继承

    protected

    protected

    不可见

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

    对于公有继承方式

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

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

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

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

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

    对于私有继承方式

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

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

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

    所有成员都是不可见的。

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

    对于保护继承方式

    这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,对基类成员有不同的可见性(私有继承后派生类中的成员的被访问特性变成是private,而保护继承变成是protected)。

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

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

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

    所有成员都是不可见的。

    上述所说的可见性也就是可访问性。

    关于可访问性还有另的一种说法。这种规则中,称派生类的对象对基类访问为水平访问,称派生类的派生类对基类的访问为垂直访问。

    看看这样的例子:

    #include

    usingnamespacestd;

    //

    classA//父类

    {

    private:

    intprivatedateA;

    protected:

    intprotecteddateA;

    public:

    intpublicdateA;

    };

    //

    classB :publicA//基类A的派生类B(共有继承)

    {

    public:

    voidfunct()

    {

    intb;

    b=privatedateA;   //error:基类中私有成员在派生类中是不可见的

    b=protecteddateA; //ok:基类的保护成员在派生类中为保护成员

    b=publicdateA;    //ok:基类的公共成员在派生类中为公共成员

    }

    };

    //

    classC :privateA//基类A的派生类C(私有继承)

    {

    public:

    voidfunct()

    {

    intc;

    c=privatedateA;    //error:基类中私有成员在派生类中是不可见的

    c=protecteddateA;  //ok:基类的保护成员在派生类中为私有成员

    c=publicdateA;     //ok:基类的公共成员在派生类中为私有成员

    }

    };

    //

    classD :protectedA//基类A的派生类D(保护继承)

    {

    public:

    voidfunct()

    {

    intd;

    d=privatedateA;   //error:基类中私有成员在派生类中是不可见的

    d=protecteddateA; //ok:基类的保护成员在派生类中为保护成员

    d=publicdateA;    //ok:基类的公共成员在派生类中为保护成员

    }

    };

    //

    intmain()

    {

    inta;

    B objB;

    a=objB.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见

    a=objB.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见

    a=objB.publicdateA;    //ok:基类的公共成员在派生类中为公共成员,对对象可见

    C objC;

    a=objC.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见

    a=objC.protecteddateA; //error:基类的保护成员在派生类中为私有成员,对对象不可见

    a=objC.publicdateA;    //error:基类的公共成员在派生类中为私有成员,对对象不可见

    D objD;

    a=objD.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见

    a=objD.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见

    a=objD.publicdateA;    //error:基类的公共成员在派生类中为保护成员,对对象不可见

    return0;

    }

    最后结合这个例子,做一点通俗些的总结。

    关于公有,私有,保护继承,那么其所涉及到的主要有两点:

    (1)基类中的成员的被访问特性经过继承之后,在派生类中的被访问特性的变化。

    比如说,在基类有一个成员变量A,他是public的,那么经过公有,私有,保护继承之后,他的被访问特性变成:public,private,protected。

    那么通过这个表我们就可以清楚的知道其具体的变化了。

    public

    protected

    private

    公有继承

    public

    protected

    不可见

    私有继承

    private

    private

    不可见

    保护继承

    protected

    protected

    不可见

    (2)经过继承之后,派生类所产生的对象对基类中的这些成员的访问访问权限。

    那么我们也可以通过这个表来体现:

    public

    protected

    private

    公有继承

    可见

    不可见

    不可见

    私有继承

    不可见

    不可见

    不可见

    保护继承

    不可见

    不可见

    不可见

    其实经过第一点的介绍也是很容易理解的,比如说一个基类的public成员,经过private继承之后,在派生类中的被访问特性已经变成了private,那么其所产生的对象当然对这个成员就是不可见的啦!

    展开全文
  • 保护继承在保护继承方式基类的公有成员保护成员被派生类继承后变成派生类的保护成员,而基类的私有成员在派生类不能访问。因为基类的公有成员保护成员在派生类中都成了保护成员,所以派生类的新增成员可以...

    鸡啄米在编程入门系列上一节中讲了公有继承方式的访问属性,这一节接着讲剩下的两种继承方式:保护继承和私有继承。

    一.保护继承

    在保护继承方式中,基类的公有成员和保护成员被派生类继承后变成派生类的保护成员,而基类的私有成员在派生类中不能访问。因为基类的公有成员和保护成员在派生类中都成了保护成员,所以派生类的新增成员可以直接访问基类的公有成员和保护成员,而派生类的对象不能访问它们,上一讲鸡啄米说过,类的对象也是处于类外的,不能访问类的保护成员。对基类的私有成员,派生类的新增成员函数和派生类对象都不能访问。

    通过上述保护继承的讲解,相信大家对类的保护成员的访问属性有更加深刻的理解了。假设A类是基类,B类是从A类继承的派生类,A类中有保护成员,则对派生类B来说,A类中的保护成员和公有成员的访问权限是一样的。而对A类的对象的使用者来说,A类中的保护成员和私有成员都一样不能访问。可见类中的保护成员可以被派生类访问,但是不能被类的外部对象(包括该类的对象、一般函数、其他类等)访问。我们可以利用保护成员的这个特性,在软件开发中充分考虑数据隐藏和共享的结合,很好的实现代码的复用性和扩展性。

    鸡啄米举个简单的例子讨论下保护成员的访问属性。class Base

    {

    protected:

    int x;           // 基类的保护成员

    };

    int main()

    {

    Base base;

    base.x = 0;      // 编译报错

    return 0;

    }

    这段代码在编译的时候会报错,错误就出在通过对象base访问保护成员x时,就像上面讲的,对Base类的对象base的使用者来说,Base类中的保护成员x和私有成员的访问特性是一样的,所以对象base不能访问x,这样跟使用私有成员一样通过保护成员实现了数据的隐藏。class Base

    {

    protected:

    int x;           // 基类的保护成员

    };

    class Child : public Base

    {

    public:

    void InitX();

    };

    void Child::InitX()

    {

    x = 0;

    }

    对上面的派生类Child来说,基类Base中的保护成员x和公有成员的访问权限一样,所以Child类的成员函数InitX可以访问Base类的保护成员x。

    二.私有继承

    在私有继承方式中,基类的公有成员和保护成员被派生类继承后变成派生类的私有成员,而基类的私有成员在派生类中不能访问。派生类的新增成员可以直接访问基类的公有成员和保护成员,但是在类的外部通过派生类的对象不能访问它们。而派生类的成员和派生类的对象都不能访问基类的私有成员。

    讲到这里,我们看到不管是保护继承还是私有继承,在派生类中成员的访问特性都是一样的,都是基类的公有和保护成员可以访问,私有成员不能访问。但是派生类作为基类继续派生新类时,两种继承方式就有差别了。例如,A类派生出B类,B类又派生出C类,如果B类是以保护继承方式从A类继承的,则A类的公有成员和保护成员都成为B类的保护成员,再由B类派生出C类时,原来A类的公有成员和保护成员间接继承到C类中,成为C类的保护成员或者私有成员(C类从B类公有继承或保护继承时为前者,私有继承时为后者),所以C类的成员可以间接访问A类的公有成员和保护成员。但是如果B类是以私有继承方式从A类继承的,则A类的公有成员和保护成员都成为B类的私有成员,A类的私有成员不能在B类中访问,B类再派生出C类时,原来A类的所有成员都不能在C类中访问。

    由以上分析得出,私有继承使得基类的成员在其派生类后续的派生中不能再被访问,中止了基类成员继续向下派生,这对代码的复用性没有好处,所以一般很少使用私有继承方式。

    鸡啄米将上一讲中的例子由公有继承改为私有继承,继而更形象的说明私有继承的特性。#include 

    using namespace std;

    class Base            // 基类Base的声明

    {

    public:               // 公有成员函数

    void SetTwo(int a, int b)  { x=a; y=b; }

    int GetX()   { return x; }

    int GetY()   { return y; }

    private:              // 私有数据成员

    int x;

    int y;

    };

    class Child : private Base    // 派生类的声明,继承方式为私有继承

    {

    public:                      // 新增公有成员函数

    void SetThree(int a, int b, int c)  { SetTwo(a, b); z=c; }

    int GetX()   { return Base::GetX(); }

    int GetY()   { return Base::GetY(); }

    int GetZ()   { return z; }

    private:                     // 新增私有数据成员

    int z;

    };

    int main()

    {

    Child child;           // 声明Child类的对象

    child.SetThree(1, 2, 3); // 设置派生类的数据

    cout <

    cout <

    return 0;

    }

    程序运行结果:

    The data of child:

    1,2,3

    Child类从Base类中私有继承,Base类中的公有成员SetTwo()、GetX()和GetY()成为Child类的私有成员,在Child类中可以直接访问它们,例如Child类的成员函数SetThree()中直接调用了Base类的公有成员函数SetTwo()。Base类的私有成员x和y在Child类中不能访问。在外部通过Child类的对象不能访问Base类的任何成员,因为Base类的公有成员成为Child类的私有成员,Base类的私有成员在Child类中不能访问。那么Base类的作为外部接口的公有成员SetTwo()、GetX()和GetY()都被派生类Child隐藏起来,外部不能通过Child类的对象直接调用。

    如果我们希望派生类也提供跟基类中一样的外部接口怎么办呢?我们可以在派生类中重新定义重名的成员。上面的Child类就重新定义了公有成员函数GetX()和GetY(),函数体则只有一个调用基类函数的语句,照搬了基类函数的功能。因为派生类中重新定义的成员函数的作用域位于基类中同名函数的作用域范围的内部,根据前面可见性中讲的同名覆盖原则,调用时会调用派生类的函数。通过这种方式可以对继承的函数进行修改和扩展,在软件开发中经常会用到这种方法。

    大家可能发现,main函数的函数体跟上一讲例子中的完全相同,但实际上在程序执行的时候是不同的,这里调用的函数GetX()和GetY()都是派生类Child的函数,由于是私有继承,基类Base中的同名函数都不能通过Child类的对象访问。

    这个例子跟上一讲的例子相比,Base类和主函数main的函数体都没有修改,鸡啄米只修改了派生类Child的声明,但Child类的外部接口没有改变。到此大家有没有认识到面向对象设计封装性的优越性?我们可以根据需要调整类的内部数据结构,但只要保持外部接口不变,那我们做的类的内部调整对外部就是透明的,不会影响到程序的其他部分。这充分体现了面向对象设计的可维护性和可扩展性。

    关于派生类以各种继承方式派生后对基类成员的访问控制就讲到这里了,几种继承方式中最常用的就是公有继承了,但保护继承和私有继承大家也有必要学习一下,对于提升内功很有帮助。有问题到鸡啄米博客留言交流吧。

    展开全文
  • 保护成员变量: _foo:以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import * 普通成员变量:foo 类外可访问。 私有方法:__private_method...
  • 首先,基类的私有成员是会被派生类继承的,但是不能被派生类访问;...对于基类private类型的成员变量,无论是公有继承还是私有继承派生类定义的成员函数都不能直接访问基类的私有成员,只能通过基类的...

    首先,基类的私有成员是会被派生类继承的,但是不能被派生类访问;从物理上讲是复制过来了,在内存中确实有复制。但是从程序上看是被屏蔽了,不能直接调用。

    其次,对于基类public类型的成员变量,无论是公有继承还是私有继承,都可以直接在派生类中定义的成员函数直接访问。
    对于基类private类型的成员变量,无论是公有继承还是私有继承,在派生类中定义的成员函数都不能直接访问基类的私有成员,只能通过基类的public或protect成员函数访问。

    #include<iostream>
    using namespace std;
    
    class A
    {
    private :
    int a;
    public :
    //构造函数,默认将a赋值为2;
    A()
    {
    a = 2;
    }
    //获得私有成员a的值
    int getNum()
    {
    return a;
    }
    };
    
    class B : private A
    {
    public:
    //因为是私有继承,无法访问基类的公有成员函数,
    //只能自定义一个成员函数来访问该类B从基类A继承下来的属性。
    int get()
    {
    return getNum();//getNum函数是从基类私有继承下来的私有函数。
    }
    };
    
    int main()
    {
    B b;
    cout<<b.get()<<endl;
    }

     

    展开全文
  • 3.不管以什么继承方式,派生类对象除了公有继承基类中的公有成员可以访问外,其他的一律不能访问 我们先试一下public继承 #include <iostream> using std::cout; using std::endl; class Point { public: ...
  • 三种继承方式对于基类成员的访问权限是怎样的? 对于C++的继承方式共有三种: public继承 #include <string.h> #include <iostream> using std::cout; using std::endl; //定义一个基类 class Car { ...
  • C++,obj是一个类的对象,p是指向obj的指针,该类里面有个数据成员mem,请问obj.mem和p->mem实现和效率上有什么不同。 答案是:只有一种情况下才有重大差异,该情况必须满足以下3个条件: (1)、obj 是一个...
  • 派生类继承基类成员

    千次阅读 2014-10-28 10:02:09
    这个过程,称为继承的,涉及一个基类和派生类:派生类继承基类成员其上可以添加自己的成员。 例如,让我们想象一系列的类来描述多边形两种:矩形和三角形。这两个多边形具有某些共同的特性,如需计算面积的...
  • C++学习 十五、类继承(1)基类,派生类前言类继承类的关系与继承基类, 派生类基类派生类构造函数,析构函数文件位置访问权限protected 前言 本篇开始学习C++类的继承。 类继承 C++的类继承用于描述一种is的关系。...
  • C++ 基类私有成员会被继承

    万次阅读 多人点赞 2015-11-05 00:51:24
    1.派生类间接访问继承私有成员在类的继承中,类的私有成员在派生类是“不可见“的,这种”不可见“是指派生类的成员函数,或者通过派生类的对象(指针,引用)不能直接访问它们。但是,不能直接访问并不代表不...
  • 公有继承保护继承和私有继承

    千次阅读 2020-08-30 17:28:20
    C++种public、protected、...公有继承时,对基类共有成员保护成员的访问属性不变,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。派生类的对象只能访问派生类的公有成员(包
  • 1) 三种访问权限 ① public:用该关键字修饰的成员表示公有成员,该成员不仅可以类内可以被 访问,类外也是可以被访问的,是类对外提供的可访问...① 若继承方式是public,基类成员在派生类的访问权限保持不变
  • 保护继承

    2021-03-24 15:32:51
    使用保护继承的时候,基类的公有成员保护成员会成为派生类的保护成员 私有继承基类的公有成员保护成员都会成为派生类的私有成员 使用私有继承的时候,基类为1代,他的派生类为2代,派生类的派生类为3代。 ...
  • public公有继承protected保护...公有继承时,基类的private成员派生类也不可用,基类的public和protected成员在派生类可直接使用.继承过来(变成派生类相应的public和protected成员)只有public成员在派生类外可以直接...
  • 继承的概念和定义 ** 继承概念 1、继承是面向对象程序设计 使代码可以复用的手段。—这个是类层次设计的复用。 2、允许程序员保持 原有类 特性的基础上 进行扩展,增加功能 3、继承呈现了 面向对象程序设计的层次...
  • 1. 公有继承(public)公有继承的特点是基类的公有成员保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。2. 私有继承(private)私有继承的特点是...
  • 纯虚函数 、抽象类 、多重继承 、二义性问题 、菱形继承 、虚基类 、从内存布局看虚继承的底层实现原理
  • 我相信,如果当你点开这篇博客,说明你已经进入了c++的部分了,如果是刚刚开始学习继承的同学,我建议还是先看一下,我写的类和对象,先要了解一下,这里是进阶部分,害怕直接看同学有一点看懂。 类和对象:...
  •  程序员只需新类定义已有类没有的成员来建立新类。也就是说:新类不但可以共享原有类的属性,  并且具有新的特性,这样就形成了类的层次。 单继承和多继承: 单继承:如果一个派生类只有一个基类
  • 一、多继承 ... 当一个派生类具有多个基类时,这种派生方法称为多基派生或多继承。 class z:private x, public y { //… }; 2、二义性 class X { //思考题: public: int f(); }; class...
  • 派生类类内只可能访问基类的public和protected成员 派生类对象和基类对象只能访问自...基类成员在继承派生类的权限:  基类权限: public private protected  继承权限:public 继承 public private
  • 首先回顾一下三种成员访问限定符: public(公用的):既可以被本类成员函数所引用,也可以被类的作用域内的其他函数...接下来就用一张表总结一下基类成员在派生类的访问属性: 可以这么简单的认为: ...
  • C++基础--继承

    2022-04-05 00:24:41
    有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则复杂度及性能上都有问题 多继承可以认为是C++的缺陷之一,很多后来的OO...
  • 继承情况下,来自不同父类的相同成员的访问问题 :假设子类继承自2个父类,这两个父类包含有同名的(数据)成员n,这时通过对象直接来访问该(数据)成员n时会出现什么问题? 从继承的角度讲,该数...
  • 1、单继承:class 派生类名:访问方式 基类名{ 派生类成员} 说明: 1.派生类名由用户自己命名 2.访问方式:公有、私有、保护 3.基类名必须是程序一个已有的类 4.冒号:告诉系统,派生类从那个基类派生 5.派生类...
  • C++ 多继承类 虚基类

    2019-10-27 22:11:23
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,...1.多继承派生类有多个基类或者虚基类,同一个类不能多次作为某个派生类的直接基类,但可以作为一个派生类的间接基类; class QUEUE: STACK, STACK{...
  • 知识点基类和派生类的定义派生类和基类的访问关系派生类对象对成员函数的调用派生类对象的存储派生类的构造派生类的构造函数派生类构造函数的调用顺序派生类的析构函数 基类和派生类的定义 从一个类派生出另一个类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,290
精华内容 7,316
关键字:

在保护继承中基类的共有成员