展开

关键词

C++基类私有成员会被继承

1.派生类间接访问基类私有成员 在类的继承中,基类私有成员在派生类中是“不可见“的,这种”不可见“是指在派生类的成员函数中,或者通过派生类的对象(指针,引用)不能直接访问它们。 2.私有成员会被继承吗 如果基类中并没有提供访问私有成员的公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢? 其实,这些私有成员的确是存在的,而且会被继承,只不过程序员无法通过正常的渠道访问到它们。考察如下程序,通过一种特殊的方式访问了类的私有成员。 综上所述,类的私有成员一定存在,也一定被继承到派生类中,从大小也可以看出派生类包含了基类的私有成员,读者可自行考证。只不过收到C++语法的限制,在派生类中访问基类的私有成员只能通过间接的方式进行。 ---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[8.1节]

1.6K41

C++中基类私有成员会被继承

1.派生类间接访问基类私有成员 在类的继承中,类的私有成员在派生类中是“不可见“的,这种”不可见“是指在派生类的成员函数中,或者通过派生类的对象(指针,引用)不能直接访问它们。 在派生类还是能够通过调用基类的共有函数的方式来间接地访问基类的私有成员,包括私有成员变量和私有成员函数。考察如下程序。 2.私有成员会被继承吗 如果基类中并没有提供访问私有成员的公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢? 其实,这些私有成员的确是存在的,而且会被继承,只不过程序员无法通过正常的渠道访问到它们。考察如下程序,通过一种特殊的方式访问了类的私有成员。 综上所述,类的私有成员一定存在,也一定被继承到派生类中,从大小也可以看出派生类包含了基类的私有成员,读者可自行考证。只不过收到C++语法的限制,在派生类中访问基类的私有成员只能通过间接的方式进行。

98520
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从零开始学C++继承(一):公有私有保护继承、overloadoverwriteoverride之间的区别

    一、继承 C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。 在关键字protected后面声明,与private类似,其差别表现在继承与派生时对派生类的影响不同 (三)、公有/私有/保护继承 ? 实现继承,对于私有、保护继承,派生类不继承基类的接口。派生类将不再支持基类的公有接口,它希望能重用基类的实现而已,因而将它称为实现继承。 如果不属于上述的情况,则是一般的继承,则使用一般的访问语法即可。 二、用C++设计一个不能继承的类 在Java中定义了关键字final,被final修饰的类不能被继承。 要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。

    33200

    C++继承

    ; 在c++中将继承的一方称作派生类或者子类,将被继承的一方叫做基类或者父类继承的基本格式如下(CB 继承CA): class CA { public: CA(); ~CA(); } :共有继承私有继承以及保护继承继承的方式不同,派生类对于基类的各种不同属性之间成员的访问权限不同,下面再给出一个表格用以说明这个问题: 通过这个表我们可以总结出一下几点: 1)私有成员在任何情况下都不能被派生类访问 ; 2)公有继承下其他基类成员在派生类中的访问属性不变; 3)私有继承下其他基类成员在派生类中全部变为私有; 4)保护继承下其他类成员在派生类中全部变为保护属性; 从这个表中我们可以看出,私有继承与保护继承对于基类的访问属性完全相同 ,我们知道基类的非私有成员在保护继承下公有的变为保护,保护的仍然为保护,而私有继承则是将所有都变为私有,他们之间如果都是保护继承的方式,那么CA中的其他成员在CB中都变为保护类型那么在CC中仍然能够访问到 CA的成员;当他们之间都是以私有继承的方式,那么CA中的成员在CB中都为私有,在CC中就不能访问CA中的成员,所以在一般情况下,我们将基类的数据成员声明为保护类型,这样既起到了封装的作用,又方便派生类的访问

    23520

    c++继承

    派生类可以访问基类中所有的非私有成员。 我们几乎不使用 protected 或 private 继承,通常使用 public 继承。 当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承继承即一个子类可以有多个父类,它继承了多个父类的特性。 C++ 类可以从多个类继承成员,语法如下: class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,… { <派生类类体> }; 其中,访问修饰符继承方式是 public、protected

    7710

    EasyC++84,私有继承(二)

    这是EasyC++系列的第84篇,来聊聊私有继承私有继承(二) 我们继续来看私有继承。 访问基类方法 我们知道,在私有继承时,基类的公有对象以及保护对象会变成派生类的私有对象。 我们可以在派生类方法当中使用它,但无法通过派生类对象直接调用,但无法访问基类的私有方法和对象。 这个概念我们很好理解,但具体到实现上,我们如何在派生类的方法当中调用基类的公有或者保护方法呢? 由于Student类只是继承了string类并没有自己的string实例,因此我们需要返回基类对象本身。 同样,我们怎么操作呢? 答案是使用强制转换。 引用不会自动发生转换,是因为在私有继承当中,在不进行显式类型转换的情况下,不能将派生类的引用或指针赋给基类的引用或指针。 那么问题来了,如果我们使用的是公有继承,那么是不是就可以了呢? 其次由于C++支持多继承,所以编译器将会无法确定转换成哪个基类的类型。因此还是需要我们手动进行强制类型转换。

    6810

    C++继承

    继承访问权限 父类public 父类protect 父类private public继承 public protect --- protect继承 protect protect --- private 继承 private private --- 先看继承的权限关键字,再看父类的成员变量声明关键字。 构造函数执行顺序 调用父类构造方法 调用组合类构造方法 调用本身的构造方法 析构函数执行顺序 与构造函数执行顺序相反 继承中同名成员变量 class A中有x ;class B集成A,同时也有x。 静态成员变量 遵循集成规则 使用前必须先定义 多继承产生的成员变量多义性 多个继承继承自同一个祖先类,祖先类中的成员变量使用会产生二义性。如下: ? 多个继承类中有同名的成员变量 ? 2.png

    16240

    C++继承

    Contents 1 基本概念 2 访问控制和继承 3 继承类型 4 多继承 5 参考资料 基本概念 面向对象程序设计一个重要的概念就是继承继承允许我们依据另一个类来定义一个类。 派生类可以访问基类中所有的非私有成员。 protected Shape; 我们几乎不使用 protected 或 private 继承,通常使用 public 继承。 当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承继承即一个子类可以有多个父类,继承了多个父类的成员变量和函数。

    8520

    EasyC++83,私有继承(一)

    这是EasyC++系列的第83篇,来聊聊私有继承私有继承 我们可以将一个类作为另外一个类的成员,这样可以描述has-a的关系,即包含关系。 这里的valarray是C++中的一个模板类,它可以理解成一个泛型的数组,有些类似于vector和array,但提供的功能更多。比如拥有min, size, max, sum等方法。 除了使用成员变量来描述has-a关系之外,我们还可以使用私有继承。 在私有继承当中,基类的公有成员和保护成员都会成为派生类的私有成员。 语法 首先我们来看看私有继承的语法,其实和共有继承类似,只不过将public关键字替换为private,另外由于继承关系默认为private,所以也可以不填。 我们的构造函数签名可以这么写: Student(const string& n, const double *pd, int n): name(n), scores(pd, n) {} 但我们这个例子当中用的是私有继承

    5210

    C++继承相关问题——菱形继承&继承

    什么是菱形继承?菱形继承的问题是什么? 菱形继承:菱形继承是多继承一种特殊的继承方式。如下如所示为一菱形继承 ? 即两个派生类继承同一个基类,同时两个派生类又作为基本继承给同一个派生类。 这种继承形如菱形,故又称为菱形继承。 菱形继承的问题:菱形继承主要有数据冗余和二义性的问题。 什么是菱形虚拟继承?如何解决数据冗余和二义性的? 虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在Student和Teacher的继承Person时使用虚拟继承,即可解决问题。 继承和组合的区别?什么时候用继承?什么时候用组合? public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。 组合是一种has-a的关系。 不过继承也有用武之地的,有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用继承,可以用组合,就 用组合。

    3.1K20

    EasyC++85,私有继承(三)

    这是EasyC++系列的第85篇,私有继承的最后一篇。 私有继承(三) 通过私有继承,我们可以实现一种has-a的关系。 根据C++ Primer中的阐述,大多数程序员会更倾向于使用包含,因为这更加容易理解。类声明当中包含对象,我们可以在成员函数当中直接使用,这显然更加直观,而使用继承的方式则非常地抽象。 保护继承 保护继承私有继承的变体,保护继承在列出基类时使用关键字protected: class Student : protected std::string, protected std::valarray 和私有继承一样,基类的接口在派生类当中也是可用的,但在继承层次结构之外是不可用的。当我们从派生类继续派生出第三代类的时候,私有继承和保护继承的区别就出来了。 使用私有继承时,第三代类不能使用基类的接口,因为基类的公有方法在派生类当中变成了私有方法。而使用保护继承的话,基类的公有方法在派生类变成受保护的,所以第三代派生类依然可以使用。

    8010

    私有成员是否会被继承

    首先,Java官方文档中明确表示私有成员【即私有属性(field)和私有方法(method)】不会被继承。 name);} } 总结下上面的例子: 子类的内存中出现了父类的属性 虽然子类不能直接操作父类属性,但是可以通过间接的方式操作(父类提供的公共方法、super方法或者反射) 以次可以推断出,子类确实是继承了父类的私有成员的 即:子类不会继承其父类的私有成员。但是,如果父类中具有能访问其私有字段的public或project修饰的方法,则子类也可以使用这些方法获取其私有成员。 自然是内存中,这也是为什么子类的内存中可以看到父类的私有成员; 但是由于封装性的原理,私有成员只能在自己的类中使用,所以子类是无法在自己的类中使用父类的私有成员的,既然无法使用,那我说他没有继承,也没什么问题吧 ; 这不就完美体现了继承性吗,所以再回到刚才那句Java官方文档对继承性就很合理了。 ​

    9120

    C++基础-继承

    本文为 C++ 学习笔记,参考《Sams Teach Yourself C++ in One Hour a Day》第 8 版、《C++ Primer》第 5 版、《代码大全》第 2 版。 访问限定符出现在两种场合:一个是类的成员的访问权限,类有公有成员、保护成员和私有成员;一个是类的继承方式,继承方式有公有继承、保护继承私有继承三种。 例如,基类的公有成员遇到私有继承时,就变成派生类中的私有成员;基类的保护成员遇到公有继承时,就变成派生类中的保护成员;基类的私有成员派生类不可见。 2.3 私有继承 私有继承的特点是基类的公有成员和保护成员都变成派生类的私有成员。基类的私有成员仍然为基类所私有,派生类不可见。 2.4 保护继承 保护继承的特点是基类的公有成员和保护成员都变成派生类的保护成员。基类的私有成员仍然为基类所私有,派生类不可见。 与私有继承类似,保护继承也表示 has-a 关系。

    27120

    C++之多继承

    C++支持多继承,其它的面向对象编程语言几乎都不支持多继承。而多继承一旦使用不当就会造成二义性。这可能就是其它语言都不支持多继承的原因。实际来看,几乎没有使用多继承的必要性。 下面来段代码展示一下多继承和二义性。 { }; Last类继承自C1和C2类。 C1和C2都是继承自MyClass类。 L.C1::a; L.C2::b; 基于此,C++设计了虚继承来解决上述问题的出现。

    20410

    C++继承分析

    面向对象的三大特性之一就是继承继承运行我么重用基类中已经存在的内容,这样就简化了代码的编写工作。 ,一下的内容都是采用的共有继承C++中的函数符号名称与C中的有很大的不同,编译器根据这个符号名称可以知道这个函数的形参列表,和作用范围,所以在继承的情况下,父类的成员函数的作用范围在父类中,而派生类则包含了父类的成员,所以自然包含了父类的作用范围 多重继承 多重继承的情况与单继承的情况类似,只是其父类变为多个,首先来分析多重继承的内存分布情况 class CParent1 { public: virtual void fnc1(){ 菱形继承 菱形继承是最为复杂的一种继承方式,它结合了单继承和多继承 class CGrand { public: virtual void func1(){ printf("CGrand

    28530

    C++ 虚拟继承

    ,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,也并不常用,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要因为这样只会降低效率和占用更多的空间。 为什么需要虚继承? 由于C++支持多重继承,那么在这种情况下会出现重复的基类这种情况,也就是说可能出现将一个类两次作为基类的可能性。比如像下面的情况 ? 3.笔试,面试中常考的C++虚拟继承的知识点 第一种情况:         第二种情况:          第三种情况            第四种情况: class a           class 15 int main() 16 { 17 cout<<sizeof(A)<<endl; 18 cout<<sizeof(B)<<endl; 19 return 0; 20 } 刚开始我一想子类继承父类不会继承父类的私有变量 也就是说子类把父类的私有变量也继承下来了,但是却无法访问,对于我这种菜鸟来说一下子没法转个弯来,后来看看资料焕然大悟,子类虽然无法直接访问父类的私有变量,但是子类继承的父类的函数却可以访问,不然的话如果只继承函数而不继承变量

    1.3K80

    C++:13---继承(单一继承、多重继承、多级继承、菱形继承、虚继承

    ; ③一个类不能派生其自身,原因和②是相同的 三、继承的基本特点 ①一个类可以被多个类继承 ②一个类也可以继承于多个类 四、单一继承 一个类只继承于一个类叫做单一继承 class A { }; class B :public A //单一继承 { }; 五、多重继承 一个类只继承于多个类叫做多重继承 class A{}; class B {}; class C :public B, public A //多重继承 { }; 六、多级继承 一个子类还可以作为另一个类的父类而派生出另一个子类。 最后一个类D又继承于B和C,这样形式的继承称为菱形继承 菱形继承的缺点: 数据冗余:在D中会保存两份A的内容 访问不明确(二义性):因为D不知道是以B为中介去访问A还是以C为中介去访问A,因此在访问某些成员的时候会发生二义性 虚继承的作用:为了保证公共继承对象在创建时只保存一分实例 虚继承解决了菱形继承的两个问题: 数据冗余:顶级基类在整个体系中只保存了一份实例 访问不明确(二义性):可以不通过作用域访问符::来调用(原理就是因为顶级基类在整个体系中只保存了一份实例

    1K30

    C++继承

    派生类构造函数的调用 构造函数是用来初始化类的数据成员,它不被子类继承。在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。

    16920

    c++继承

    前提概念: 多重继承:比如类a继承类b,类b继承类c,这类关系称为多重继承继承:比如类a继承类b和类c,这类关系称为多继承 典型问题: 例如: 农民类和工人类继承自人类,农民工类继承自农民类和工人类 这种菱形的继承将为带来农民工类中将有两份人类中的成员,导致数据冗余。 解决方案——虚继承: 关键字:virtual class people; class farmer:virtual public people; class worker:virtual public

    44470

    c++继承

    java相关视频" << endl; } }; class Cpp :public BasePage { public: void content() { cout << "c+ 首先需明确:子类不能访问父类的私有属性和方法。 继承方式有: 公共继承:子类所有属性和方法和修饰符和父类中保持一致; 保护继承:子类所有属性和方法为protected; 私有继承:子类所有属性和方法为private; 继承对象模型: #include 继承中同名静态成员处理:与同名成员处理一致,只不过通过类名直接访问而不是对象访问时需要加各自的作用域,即 Base::a; Son::a; Son::Base::a; 多继承语法:c++可以有多重继承。 class A:public B ,public C{}; 菱形继承:两个子类同时继承一个基类;又有某个类同时继承这两个子类; 存在两个问题: 同名成员:利用作用域区分访问即可 最后一个类继承了两份基类的数据

    12710

    相关产品

    • 私有连接

      私有连接

      私有连接(Private Link)可以帮助您将私有网络(VPC)安全私密地连接到其他VPC的服务。私有连接无需通过互联网,所以具备更安全、更低时延以及更低成本等优势。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券