首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++中派生类对基类成员的访问形式

C++中派生类对基类成员的访问形式主要有以下两种: 1、内部访问:由派生类中新增成员对基类继承来的成员的访问。 2、对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。...今天给大家介绍在3中继承方式下,派生类对基类成员的访问规则。...基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类的成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。...基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数直接访问它们。...基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类中的private成员。

2.4K70

派生类对基类中虚函数和非虚函数的继承效果

“强制实现”,也就是只要是父类指针调用普通函数,那就是父类的普通函数 而虚函数的作用,主要是为了让父类指针可以调用子类的函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++的虚函数主要作用是...子类可以重写父类的虚函数实现子类的特殊化。 2、纯虚函数:   C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。   ...C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   C++中的纯虚函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。   普通函数是父类为子类提供的“强制实现”。   ...因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。 参考链接

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

    C++之面向对象的三个基本特征

    9)从理论上说,可以将一个运算符重载为执行任意的操作。   ...虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。...需要说明;有时在基类中定义的非虚函数会在派生类中被重新定义(如例12.1中的area函数),如果用基类指针调用该成员函数,则系统会调用对象中基类部分的成员函数;如果用派生类指针调用该成员函数,则系统会调用派生类对象中的成员函数...虚析构函数 析构函数的作用是在对象撤销之前做必要的“清理现场”工作;当派生类的对象从内存中撤销时,一般先调用派生类的析构函数,再调用基类的析构函数。...从运行结果可以看出,执行delete p;语句时只调用了基类的析构函数,却没有调用派生类的析构函数。

    1.1K60

    领悟面向对象就离开发应用不远了(类提高)有你对面向对象的所有疑问,爆肝1w字

    文章目录 前言 一、面向对象 二、使用类 1.类的基础使用 2.运算符重载 3.友元 1.友元函数 2.友元类 3.友元成员函数 三、类继承 基类 派生类 插个访问权限的事情 2.多态 ***公有 **...,但是它还是乘法运算符 再看如何定义一个自己的重载运算符 operator+()重载+运算符 返回值类型 operator 运算符(形参表) { .... } 实例: #include 基类的实现) 派生类还继承了基类的接口 当然派生类和其他类的使用方法大致一样:可以有自己的构造函数,可以添加额外的数据成员和成员函数 插个访问权限的事情 首先派生类不能直接访问基类的私有成员,...秋名山上有你 还要注意,基类和派生类中所题,派生类访问基类数据是构造函数访问基类的公有数据,记住!...这样就可以将基类与派生类的同名方法区分开,实现多态。 3.抽象基类 不能实例化的基类被称为抽象基类, 这样的基类只有一个用途, 那就是从它派生出其他类。

    53220

    【C++进阶篇】像传承家族宝藏一样理解C++继承

    继承中的访问权限 4.1 基类成员在派生类中的访问权限 基类的 public、protected 和 private 成员在派生类中的访问权限取决于继承方式。...下面是不同继承方式下的访问权限表: 从表中可以看出基类的private成员在派生类(子类)始终不可见,而基类的public成员和protected成员的是否能被访问取决于本身成员的访问权限与继承方式,...同样,赋值运算符的调用顺序也遵循这一规则:基类的赋值运算符会先于派生类的赋值运算符被调用。...<< endl; } //赋值运算符重载 Student& operator=(const Student& s) { Teacher::operator=(s);//先调用基类的赋值运算符重载...从结果可以看出基类的拷贝构造和赋值运算符重载优先级优于派生类。为了保证派生类对象的完整性,派生类的拷贝构造函数和赋值运算符必须调用基类的相应函数,确保基类成员正确处理。

    10810

    C++ 重载运算符 继承 多态 (超详细)

    )双目运算符重载为成员函数 当重载运算符为双目运算符时,形参表中只有一个参数作为右操作数。...(3)单目运算符重载为成员函数 此时参数表中没有参数,只有当前对象作为运算符的一个操作数。...(4)派生类中的静态数据成员 基类中定义的静态成员,将被所有派生类共享 2、基类初始化: (5)派生类的初始化 派生类构造函数声明格式为: 派生类构造函数(变元表):基类(变元表)、对象成员1(...声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类的定义的成员。...可以理解为派生类完全包含基类,指向基类的任何成员,都可以在公有派生类中找到对应的成员对象与之对应,如果是私有继承,能找到但是不能访问。但是派生类中有的对象,基类中不一定会有,所以不能这么操作。

    1.2K21

    C++ 类、继承、重载《Rice C++ 学习开发》

    因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。...我们可以根据访问权限总结出不同的访问类型,如下所示: 访问publicprotectedprivate同一个类yesyesyes派生类yesyesno外部的类yesnono 一个派生类继承了所有的基类方法...2.基类的重载运算符。 3.基类的友元函数。 继承类型:当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。

    64810

    C++期末复习总结(2)

    是关键字,+就是我们想要重载的运算符 ; (5)上面的这个运算符重载的基本写法,实际上这个运算符的重载既可以写作成员函数,也可以写作全局函数,当我们实现一个类和一个整形数据加法的时候,如果我们写在成员函数里面...:赋值运算符= 函数调用运算符( ) 下标运算符[ ] 以及这个指针访问成员操作符-> ; 2.四种运算符重载 (1)关系运算符的重载 关系运算符就是我们常说的这个大于小于和等于这些符号的比较...,不能写成成员函数; (3)下标运算符的重载 如果没有重载下标运算符,如果我们想要查看这个数组元素,我们就需要自己定义函数,使用这个小括号加上下标的方式表示,但是我们知道这个访问操作符就是中括号,因此下面我们介绍小标访问运算符的重载...,在基类和派生类的构造函数里面,this指针是相同的地址,派生类和基类都有的成员变量的地址也是一样的; (5)在C++里面这个成员变量的访问权限只是语法上面的限制,我们可以使用memset函数清零数据,...前面加上virtual关键字,就可以使用这个执行派生类对象的指针去访问这个派生类的函数,即使这个类是基类的,我们也是可以访问到这个派生类的成员函数的; 因为这个是函数前面加上virtual关键字,我们把这个函数叫做虚函数

    5400

    60秒问答:多态和函数重载的关系?

    隐藏:不用作用域, 通过派生类访问:派生类同名函数,隐藏基类函数 或者通过基类指针访问,基类函数隐藏派生类。 二、 问题:如何解隐藏问题?...编译时的多态:函数重载和运算符重载(根据参数不同选择具体函数 ) 运行时的多态:通过类继承和虚函数实现的(根据虚表指针 指向 派生类的函数,还是基类的函数) 四、 类型转换有几种情况,有什么区别?...:通过类继承和虚函数实现的,在运行时就就决定调用哪个函数 重写(override)就是一种运行时多态 覆盖是存在类中,【子类重写】从基类继承过来的函数,函数名、返回值、参数列表都必须和基类相同 重载,重写都出现了...隐藏:不用作用域, 通过派生类访问:派生类同名函数,隐藏基类函数 或者通过基类指针访问,基类函数隐藏派生类。 二、 问题:如何解隐藏问题?...编译时的多态:函数重载和运算符重载(根据参数不同选择具体函数 ) 运行时的多态:通过类继承和虚函数实现的(根据虚表指针 指向 派生类的函数,还是基类的函数) 四、 类型转换有几种情况,有什么区别?

    1.4K10

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    基类中此成员的访问说明符,这是最重要的一部分 派生类的派生列表的访问说明符,这一项决定的是派生类对继承来的成员对外表现出的最高权限 有时候我们需要改变外部对派生类继承的某个名字的访问级别,可以在自己的访问控制符处用...using声明需要改变的名称(用::作用域符特指名称) 派生类对基类的转换也与派生列表的访问说明符有关,本质上与类型转换函数的权限有关 名称查找是根据编译时的目标的静态类型从内到外进行查找的,目标的静态类型决定了其是否可见...因此除了重载虚函数外最好不要让名称同名 派生类可以覆盖基类重载的函数,但是如果派生类希望基类重载的几个函数都在派生类中可见的话:一种方法是不覆盖任何一个重载函数或将所有重载函数都进行一次覆盖;另一种方法是为需要重载的函数名使用...,对于实现的内容我们一样可以使用=default简化 如果基类中的基本操作函数不可访问或被删除,则派生类中的对应成员是被删除的因为我们无法使用基类来操作那些成员 C11中,我们可以用using重用基类定义的构造函数...,写法和15.6中指明重载的基类函数一样,效果与定义一个空的构造函数然后列表中调用基类构造函数一致 和普通函数的using不同,对构造函数的using不会改变构造函数的访问级别 当基类构造函数中有默认实参时

    1.7K10

    C++之多态的一个例子

    数据成员x和y声明为protected,这样可以被派生类访问(如果声明为private,派生类是不能访问的)。...程序编译通过,运行结果为: x=3.5,y=6.4 p(new):[8.5,6.8] 测试程序检查了基类中各函数的功能,以及运算符重载的作用,证明程序是正确的。...现在 Circle是Point的公用派生类,因此,pRef不能认为是c的别名,它得到了c的起始地址, 它只是c中基类部分的别名,与c中基类部分共享同一段存储单元。...请注意,这两个area函数不是重载函数,它们不仅函数名相同,而且函数类型和参数个数都相同,两个同名函数不在同 —个类中,而是分别在基类和派生类中,属于同名覆盖。...从输 出的结果可以看出调用的是哪个运算符函数。

    89970

    一文带你掌握多继承,菱形继承以及虚拟继承

    如果不想访问子类的同名成员,可以在子类成员函数中显示调用父类的成员. 显示调用格式: 基类: 基类成员 出现相同的名称的变量终究是容易让人混乱的,还是不建议在子类和父类中定义同名成员变量....那在派生类中,这几个成员函数是如何生成的呢? (1) 构造函数: 派生类的构造函数必须调用基类的构造函数,利用基类的构造函数去初始化基类的部分.并且是先调用基类的构造之后,再去构造派生类的成员....(3拷贝构造与赋值运算符重载: 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。 派生类的operator=必须要调用基类的operator=完成基类的复制。...不难发现,m中,People类有两个,也就意味着m对象里面有两个_a,这也就导致了数据冗余,和数据访问的二义性. 那菱形继承的这两个问题该如何解决呢?...继承允许你根据基类的实现来定义派生类的实现。在继承方式中,基类的内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。

    34450

    C++查缺补漏

    基类的public和protected成员:访问属性在派生类中保持不变 基类的private成员:不可直接访问 访问权限 派生类中的成员函数:可以直接访问基类中的public和protected成员,...基类的private成员:不可直接访问 访问权限 派生类中的成员函数:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员 通过派生类的对象:不能直接访问从基类继承的任何成员...:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员 通过派生类的对象:不能直接访问从基类继承的任何成员 protected 成员的特点与作用 对建立其所在类对象的模块来说...不需要显式地调用基类的析构函数,系统会自动隐式调用 先执行派生类析构函数的函数体,再调用基类的析构函数 访问从基类继承的成员 当派生类与基类中有相同成员时: 若未特别限定,则通过派生类对象使用的是派生类中的同名成员...成员名”访问成员存在二义性问题 解决方式:用类名限定 虚基类 需要解决的问题 当派生类从多个基类派生,而这些基类又共同基类,则在访问此共同基类中的成员时,将产生冗余,并有可能因冗余带来不一致性 虚基类声明

    2.6K10

    C++基础——C++面向对象之重载与多态基础总结(函数重载、运算符重载、多态的使用)

    虚函数:指的是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。...纯虚函数:若在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。...中的speak()方法前加了virtual关键字,变成了虚函数;虚函数是C++中实现多态的机制,核心就是通过基类访问派生类定义的函数;         上面的实例是基类 Animal 声明了一个指针 animal...然后通过基类的指针来访问 Dog 类对象与 People 类的对象的 speak()方法,前提是基类的 speak()方法必须声明为虚函数,且基类和派生类中定义的方法名要相同,否则,基类的指针将访问到基类自己的...;多态的实现机制是通过虚函数,核心就是通过基类访问派生类定义的函数;有了多态,我们可以在程序中任意点可以根据所调用的对象类型来选择调用的函数,实现动态链接,或后期绑定的效果。

    87210

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

    菱形继承的问题是什么? 菱形继承:菱形继承是多继承一种特殊的继承方式。如下如所示为一菱形继承 ? 即两个派生类继承同一个基类,同时两个派生类又作为基本继承给同一个派生类。...菱形继承的问题:菱形继承主要有数据冗余和二义性的问题。由于最底层的派生类继承了两个基类,同时这两个基类有继承的是一个基类,故而会造成最顶部基类的两次调用,会造成数据冗余及二义性问题。...这种通过生成派生类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。...继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。 对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。...运算符重载赋值函数:赋值运算符重载函数也不会被子类继承,只是在子类的赋值运算符重载函数中会调用父类的赋值运算符重载函数。

    7.8K41

    【C++篇】继承之韵:解构编程奥义,感悟面向对象的至高法则

    或 private,它们决定了基类的成员在派生类中的访问权限。...第二章:继承中的访问权限 2.1 基类成员在派生类中的访问权限 基类的 public、protected 和 private 成员在派生类中的访问权限取决于继承方式。...成员 protected protected private 基类的 private 成员 不可见 不可见 不可见 从表中可以看出,基类的 private 成员在派生类中始终不可见(不可访问),无论采用何种继承方式...在派生类中,如果我们希望访问基类中的同名函数,必须显式调用基类的函数。...并且函数重载说的是同一作用域,而这里基类和派生类时两个作用域 3.2 派生类的默认成员函数 在 C++ 中,当我们不显式定义类的构造函数、拷贝构造函数、赋值运算符和析构函数时,编译器会自动为我们生成这些函数

    11510

    1小时精通c++面向对象编程

    图5-2 运算符重载 5.1.4 重载为类的成员函数 重载一元运算符,不再显式说明参数 重载二元运算符,只显式说明一个参数;该参数为操作数的右操作数,左操作数由this指针(指向调用该成员函数的对象)提供...动态联编的优点是灵活性强,但效率低 实现动态联编需要同时满足以下三个条件: 1必须把动态联编的行为定义为类的虚函数 2类之间应满足子类型关系,通常表现为一个类从另一个类公有派生而来 3必须先使用基类指针指向子类型的对象...act1() 5.5 纯虚函数 在基类中不能为虚函数给出一个有意义的实现时,可将其声明为纯虚函数,其实现留待派生类完成 5.5.1 纯虚函数定义格式 ?...图5-9 纯虚函数 5.6 抽象类 带有纯虚函数的类称为抽象类 抽象类只能作为基类使用,其纯虚函数的实现由派生类给出;但派生类仍可不给出纯虚函数的定义,继续作为抽象类存在 抽象类不能定义对象,一般将该类的构造函数说明为保护的访问控制权限...,其完整的实现由派生类完成 2用作指针或引用的基类型:保证进入继承层次的每个类都具有(提供)纯虚函数所要求的行为 ?

    85430

    封装、继承、多态、重载:C++中的强大特性与代码设计

    protected(保护)访问修饰符与私有访问修饰符类似,但允许派生类(子类)访问基类中的保护成员。...继承 C++中的继承是面向对象编程的一个重要概念,它允许一个类(派生类/子类)从另一个类(基类/父类)继承属性和行为。...成员声明列表中包含类成员变量以及成员函数,是派生类新增的成员。 “:”是一个运算符,表示基类和派生类之间的继承关系。...C++中的继承有以下几种类型: 公有继承(public inheritance):派生类继承了基类的公有成员和保护成员,并且这些成员在派生类中的访问权限与基类中的一样。...派生类的对象可以直接访问基类的公有成员。 私有继承(private inheritance):派生类继承了基类的公有成员和保护成员,但是这些成员在派生类中的访问权限变为私有。

    51910

    《C++Primer》第十五章 面向对象程序设计

    成员函数如果没被声明成虚函数,那么其解析过程发生在编译时而不是运行时 派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员(派生类可以访问公有成员,但是不能访问私有成员...一如往常,名字查找先于类型检查 声明在内层作用域的函数并不会重载声明在外层作用域的函数。因此定义派生类中的函数也不会重载其基类的成员。...虚函数与作用域 从名字查找先于类型检查我们可以得知为什么基类和派生类中的虚函数为什么必须有相同的形参列表了。...有一些情况下一个类仅仅需要覆盖重载集合中的一些而非全部函数,一种好的方法是为重载的成员提供一个using声明语句,这样我们就无须覆盖基类中的每一个重载版本了。...using可以改变个别成员的可访问性,这样基类函数的每个实例在派生类中都必须是可访问的,对派生类没有重新定义的重载版本访问实际上是对using声明点的访问。 构造函数与拷贝控制 1.

    1.2K20

    大学C++课程提炼概括【C++笔记】

    :"条件运算符 这五个不可重载 //重载不会改变运算符优先级 //重载双目运算符 "==" ">" "<" //要构建一个String 类,重载函数以友元函数的形式出现在类中,双目符重载函数作为成员函数报错...) class person { }; class student : public person //公有继承(最多) { //基类的私有成员不能用派生类新定义的成员函数去访问,只能通过继承过来的成员函数去访问基类私有成员数据...,就可以在该派生类中用虚函数调用 //虚函数要和基指针结合使用 //基指针:基类类型指针,可以指向基类,也可以指向由它的派生类抽象而来的实例,但是也只能调用基类继承过来的函数 //只使用基指针调用派生类...参数表 ) =0; //在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。...delete p;//基指针指向过基类、派生类,需要定义基类析构函数为虚函数,否则,执行该操作后,只释放基类内存,可能会内存泄漏 } //多态性 //静态多态性:函数重载、运算符重载 //动态多态性:

    39370
    领券