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

C++私有成员会被继承吗

1.派生间接访问私有成员的继承的私有成员在派生是“不可见“的,这种”不可见“是指在派生成员函数,或者通过派生的对象(指针,引用)不能直接访问它们。...,由于A的成员变量i和成员函数privateFunc()都是私有的,所以在B的成员函数无法直接访问到它们。...()就可以简介访问A的私有成员。...2.私有成员会被继承吗 如果并没有提供访问私有成员的公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢?...综上所述,的私有成员一定存在,也一定被继承到派生,从大小也可以看出派生包含了的私有成员,读者可自行考证。只不过收到C++语法的限制,在派生访问的私有成员只能通过间接的方式进行。

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

C++必知必会之基础知识-常用关键(3)

START 位域 在C++,位域(bit fields)是一种特殊的数据结构,允许将结构体或成员变量按位进行分配。...由于unsigned int通常是4字节(32位),所以MyFlags的大小4字节。 在使用的位域时,需要注意成员访问权限以及可能的内存对齐问题。...+函数 return 0; } 在上述示例,我们通过使用extern "C"关键字来正确地链接C和C++之间的函数。...派生继承了成员和方法。...C++除此之外的特性还有: 默认访问控制符 public 可以含有构造函数、析构函数 不能含有引用类型的成员 不能继承自其他,不能作为 不能含有虚函数 匿名 union 在定义所在作用域可直接访问

12730

C++|对象模型|对象模型综述

第二种,他设计了一个结构体,其中index在不存在时会设置-1作为哨兵,此时则会直接查询faddr: struct _mptr{ int delta;//this指针的offset值(应对多重继承情况...一个古老的实现方法是,在每一个派生对象存放一个虚指针而非传统对象模型对象本身,对虚的访问通过指针间接实现,以此实现共享。...如下图所示:派生都可以通过vptr获取offset,从而正确地指向虚的地址。...归根到底是为了解决虚位置变化导致的问题。语法苦恼的应该是C++编译器作者,而不是程序员。...,还是可以正确地调整this指针,然而涉及虚继承虚时,并且都支持virtual function和nonstatic data member时(共同特点:Object Level,如果你记忆好的话

63910

C++进阶学习】第三弹——菱形继承和虚拟继承——菱形继承的二义性和数据冗余问题

前言: 在前面,我们已经讲过继承的相关知识,今天我们来将一个由继承拓展出来的很重要的知识,那就是——菱形继承和虚拟继承及相关知识讲解 一、单继承和多继承 C++单继承 在C++,单继承是指一个只能继承自一个...Derived 可以访问 Base 声明为 public 的成员C++多继承 多继承允许一个继承自多个。这意味着派生可以有多个直接的。...在菱形继承,派生会继承两个的所有公共和私有成员。...虚:在虚继承,被继承的被称为虚。 虚成员变量和成员函数在子类只会存在一份,避免了冗余性问题。...2、虚表:虚继承会在运行时每个对象创建一个虚表,用于记录虚的实际地址,以便在运行时正确地访问虚成员变量和成员函数。

6710

C++ 面试必备:常见 C++ 面试题汇总及详细解析

的某个虚函数在派生中被重新定义时,如果派生对象调用该函数,则会覆盖掉的实现,执行派生的实现代码。在进行对象的多态性转换时,重写非常重要。...引用也是C++的一种数据类型,它提供了一种简洁而高效的方式来操作变量和对象,而不需要拷贝它们本身。引用被视为原变量的一个别名,其操作类似于指针,但是引用不能被赋值NULL,也不能进行指针运算。...虚指针的设置是由编译器来完成的,当一个中含有虚函数时,编译器就会在增加一个虚指针来指向虚函数表,每个对象都有一个虚指针,指向它所属的的虚函数表。...的析构函数为何要声明为虚函数? C++的析构函数声明为虚函数是为了确保在通过的指针或引用删除派生对象时,可以正确地释放派生对象所占用的内存。...例如,如果有一个的定义在一个.h文件,那么在多个.cpp文件可以使用extern关键字来声明这个的引用,从而可以在这些文件中使用这个成员函数。 C++函数调用的过程?

1.9K30

C++C++ 的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 这个增加的参数是 对象本身的指针 ; 在 Student , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...的 print 成员函数 , 转为 全局函数 , 转换后的代码 : // 将成员函数 void print() // 转为 全局函数 void Student_print(Student* pThis..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数 , 通过 this 指针访问对象本身的成员 ; 在全局函数 , 实现两个 Student 相加 , 接收两个..., 将两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 两个 对象相加 , 最终结果累加到 本对象 // 注意此处 : 函数重载 不以 返回值标准 , 函数名需要修改

17920

C++ using用法

一共有三处使用了using,分别是第3,16,22行,它们的作用为: 引入命名空间 指定别名 在子类引用成员 引入命名空间 指定命名空间是C++ using namespace中最常被用到的地方...在子类引用成员 using的第三个作用是子类引用成员,一般都是using CBase::a;这样的形式出现,比如在22行: using typename ClassType::ModuleType...如果ClassType不是模板的话,这行代码就可以写成: using ClassType::ModuleType; 剩下的就是using的作用,它引用了成员ModuleType, ModuleType...又是ClassOne的别名,所以后面ModuleType m;相当于定义对象m,对于子类成员m来说,这样的效果和下面是相同的: typename ClassType::ModuleType m; 不同之处在于...using还修改了成员的访问权限,子类ClassThree 私有继承ClassType,所以ClassType中共有成员ModuleType 在子类ClassThree 是私有的,它不能被外部访问。

1.4K40

C++之多态的一个例子

以它为,派生出一个Circle(圆),增加数据成员r(半径),再以Circle直接,派生出一个Cylinder(圆柱体),再增加数据成员h(高)。...程序编译通过,运行结果: x=3.5,y=6.4 p(new):[8.5,6.8] 测试程序检查了各函数的功能,以及运算符重载的作用,证明程序是正确的。...前面我们已经讲过,派生对象可以替代对象对象的引用初始化或赋值(详情请查看:C++与派生的转换)。...现在 Circle是Point的公用派生,因此,pRef不能认为是c的别名,它得到了c的起始地址, 它只是c部分的别名,与c部分共享同一段存储单元。...pRef是Point的引用变量,用cy1对其初始化,但它不是cy1的别名,只是cy1Point部分的别名,在输出pRef时是作为一个Point对象输出的,也就是说,它是一个“点”。

86870

编译器角度看C++复制构造函数

深拷贝: 深拷贝时使用一个对象的内容来创建同一个的另一个实例,B复制了A的所有成员,并在内存不同于A的区域B分配了存储空间,也即是说B拥有自己的资源。...前两种情况,编译器必须将“成员的复制构造函数调用操作”安插到新合成的复制构造函数中去,如果类设计者已经明确声明了一个复制构造函数,则这些调用操作代码将插入到已有的复制构造函数中去(在函数体的最前端插入...后两种操作涉及到了虚表指针与虚指针的产生于初值设置。...每一个对象增加一个虚表指针(vptr),虚表指针指向了该类的虚表。 显然,如果编译器对每个新定义的对象不能正确地设置好初值,将导致严重的后果。...值得注意的是,编译器除了对vptr与虚的处理能保证安全之外,对于内置类型或复合类型指针的复制都是采用浅拷贝,所以,当我们的中含有指针的时候,我们需要自己写一个复制构造函数来对对象的指针进行深拷贝

57570

c++面试题

C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现; 在程序编译时多态性体现在函数和运算符的重载上 虚函数:在冠以关键字 virtual 的成员函数。...允许在派生的虚函数重新定义。 纯虚函数的作用:在其派生保留一个函数的名字,以便派生根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。...从继承来的纯虚函数,在派生仍是虚函数。如果一个至少有一个纯虚函数,那么这个被称为抽象(abstract class)。 抽象不仅包括纯虚函数,也可包括虚函数。...这时,被调函数的形参就成为原来主调函数的实参变量或对象的一个别名来使用,所以在被调函数对形参变量的操作就是对其相应的目标对象(在主调函数)的操作。...(3)可以返回成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。

1.2K11

C++:28 --- C++内存布局(上)

,数组是如何动态构造和销毁的; 操作系统一个C++程序的运行所分配的内存分为四个区域,如图4.3 程序在内存的区域所示: ?...除了成员变量外,C++还可以封装成员函数和其他东西。然而,有趣的是,除非 为了实现虚函数和虚继承引入的隐藏成员变量外,C++实例的大小完全取决于一个及其成员变量!...强制转化piC*时,所作的计算和访问虚成员变量的开销相同,首先得到G的虚表指针,再从虚表的第二项取出G到虚C的偏移量,最后根据pi、虚表偏移和虚C与虚表指针之间的偏移计算出...一般说来,当从派生访问虚成员时,应该先强制转化派生指针指针,然后一直使用虚指针来访问虚成员变量。这样做,可以避免每次都要计算虚地址的开销。 见下例。...4 成员函数 一个C++成员函数只是范围内的又一个成员。X每一个非静态的成员函数都会接受一个特殊的隐藏参数——this指针,类型X* const。

1K20

《Effective Modren C++》 进阶学习(上)

使用override声明重写函数 C++中子类可以重写的虚函数,但两者必须完全相同,才会被编译器认定为是重写的函数; 否则会被认定为子类自身的函数成员,且编译器不会提醒。...「小结」 override可以明确此函数是重写的虚函数接口,当不存在此接口时就会编译报错。...可以规避在声明子类接口时没有和保持一致,又难以察觉,导致子类接口在运行没有被调用到这种低级问题。 13....异常安全性:在C++,异常安全性是一个重要的概念,指的是程序在遇到异常时能够正确地处理资源的释放和状态的恢复。...对于内部申请的资源,动态分配的内存或打开的文件句柄等,编译器会在析构函数自动释放这些资源。如果类没有显式声明析构函数,则会生成默认的析构函数,执行成员的析构操作。

17020

C++知识总结

对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。 13.虚函数的使用方法是: 在用virtual声明成员函数虚函数。...在派生重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与的虚函数相同,并根据派生的需要重新定义函数体。...C++规定,当一个成员函数被声明为虚函数后,其派生的同名函数都自动成为虚函数。...如果在派生没有对的虚函数重新定义,则派生简单地继承其直接的虚函数。 定义一个指向对象的指针变量,并使它指向同一需要调用该函数的对象。...通过虚函数与指向对象的指针变量的配合使用,就能方便地调用同一不同类的同名函数,只要先用指针指向即可。如果指针不断地指向同一不同类的对象,就能不断地调用这些对象的同名函数。

98240

如何把CPP源程序改写成C语言?

C++与C区别最大的就是C++的概念和特性,将C++改为C的问题,就转换成如何将类化去的问题。...下面对C++的一些特性,以及如何在c里实现或者替代,作一些初步的探讨: 说明: 函数Ixxxx的构造函数的实现。 原成员函数改为前缀结构体名+‘_’的函数。...函数指针U的析构函数的声明; C语言学习资源汇总【最新版】 U+结构体名称为原的析构函数的实现; Fun-_+结构体名为对该结构体成员函数指针进行指向; 以后遇到上述情况将不再说明。...这是为了保持的继承带来的动态联编的特性。 之间的继承关系是复杂且多变的,为了保证在所有子类的唯一而且方便修改,最好的方法就是把的结构体部分做成宏,在子类中直接使用即可。...多继承也是可以改的,将多个成员全部拷到子类里,遇到重复的成员名,则在前面加上前缀来区别,当然这个指的是之间有相同的,如果是派生之间有重名的,则会覆盖

2.1K20

【编程基础】如何赢得C++面试

定义一个对象时先调用的构造函数、然后调用派生的构造函数;析构的时候恰好相反:先调用派生的析构函数、然后调用的析构函数 5.C++的class和struct的区别 从语法上,在C++(只讨论...C++)。...数组要么在静态存储区被创建(全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。 11.成员函数的重载、覆盖和隐藏区别?...答案:a.成员函数被重载的特征: (1)相同的范围(在同一个); (2)函数名字相同; (3)参数不同; (4)virtual关键字可有可无。...此时,的函数被隐藏(注意别与覆盖混淆) 12.求出两个数的较大值 There are two int variables: a and b, don’t use“if”,“?

1.4K70

Android NDK入门:C++ 基础知识

访问修饰符的作用如下: 公有继承(public):当一个派生自公有时,的公有成员也是派生的公有成员的保护成员也是派生的保护成员的私有成员不能直接被派生访问,但是可以通过调用的公有和保护成员来访问...保护继承(protected): 当一个派生自保护时,的公有和保护成员将成为派生的保护成员。...私有继承(private):当一个派生自私有时,的公有和保护成员将成为派生的私有成员。 通常情况下,我们都是使用 公有继承(public),也就是和 Java 是一样的。...四、C++ 引用 引用 是除了指针外,另一个非常重要的概念。在 C++ 也是经常使用的。 引用指的是:一个变量起一个别名,也就是说,它是某个已存在变量的另一个名字。...原因是,调用函数 f() 被编译器设置的版本,这就是所谓的静态多态,或静态链接。 函数调用在程序执行前就准备好了。

1.5K40

C++之面向对象的语法笔记

这个已有的称为,新建的称为派生C++ 继承的继承指的就是和派生的关系。...当使用不同类型的继承时,遵循以下几个规则: 继承类型 说明 public 当一个派生自公有时,的公有成员也是派生的公有成员的保护成员也是派生的保护成员的私有成员不能直接被派生访问...,但是可以通过调用的公有和保护成员来访问。...protected 当一个派生自保护时,的公有和保护成员将成为派生的保护成员。 private 当一个派生自私有时,的公有和保护成员将成为派生的私有成员。...C++的多态性用一句话概括就是:在的函数前加上virtual关键字,在派生重写该函数,运行时将会根据对象的实际类型来调用相应的函数。

1.5K40

硬核 | C++ 基础大全

nullptr, 但并不会破坏指针所指向的内容, 函数返回的是内部指针置空之前的值; 直接释放封装的内部指针所指向的内存, 如果指定了 ptr 的值, 则将内部指针初始化为该值 (否则将其设置nullptr...介绍 C++ 的构造函数 的对象被创建时,编译系统对象分配内存空间,并自动调用构造函数,由构造函数完成成员的初始化工作。 即构造函数的作用:初始化对象的数据成员。...,也称为某个派生的主 查看派生是否有重写的虚函数, 如果有,就替换成已经重写的虚函数地址;查看派生是否有自身的虚函数,如果有,就追加自身的虚函数到自身的虚函数表。...动态联编规定,只能通过指向的指针或对象的引用来调用虚函数,其格式:指向的指针变量名->虚函数名(实参表)或对象的引用名.虚函数名(实参表) 实现动态联编三个条件: 必须把动态联编的行为定义的虚函数...,而虚函数意味着在运行期间进行类型确定,所以内联函数不能是虚函数; 静态函数,静态函数不属于对象属于,静态成员函数没有this指针,因此静态函数设置虚函数没有任何意义。

1.2K10

《C++Primer》第十八章 用于大型程序的工具

,编译器将负责确保在这个块创建的对象能被正确地销毁。...如果异常发生在构造函数,则当前的对象可能只构造了一部分(有些成员已经初始化了,另一些成员在异常发生前也许还没有初始化)。即使某个对象只构造了一部分,我们也要确保已构造的成员能被正确地销毁。...只有当派生使用的是合成版本的拷贝、移动或赋值成员时,才会自动对其部分执行这些操作。在合成的拷贝控制成员,每个分别使用自己对应成员隐式地完成构造、赋值或销毁等工作。...要想避免潜在的二义性,最好的办法是在派生该函数定义一个新版本。...假如iostream对象真的包含base_ios的两份拷贝,则上述的共享行为就无法实现了。 在C++我们通过虚继承的机制解决问题。虚继承的目的是令某个作出声明,承诺愿意共享它的

1.3K20
领券