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

【C++】继承 ② ( 继承语法 | 三种继承 - 共有继承 保护继承 私有继承 | 继承与父类私有成员 | 子类访问父类私有成员 | 代码示例 )

- 共有继承 / 保护继承 / 私有继承 访问控制符 : 访问控制符 用于 设置 继承的方式 ; public : 公有继承 Child 类继承了 Parent 类的所有公有和保护成员 , 访问级别不变..., 并且可以访问它们 ; Child 类不能继承 Parent 类的私有成员 ; protected : 保护继承 Child 类继承了 Parent 类的所有公有和保护成员 , 这些成员会被声明为...保护成员 , 只能在类内部 或 子类中 访问它们 ; Child 类不能继承 Parent 类的私有成员 ; private : 私有继承 Child 类继承了 Parent 类的所有公有和保护成员..., 这些成员会被声明为私有的 , 只能在类内部访问它们 ; Child 类不能继承 Parent 类的私有成员 ; 3、继承与父类私有成员 C++ 的 三种继承 公有继承 public 保护继承 protected...私有继承 private 只针对 父类 的 " 公有成员 " 和 " 保护成员 " , 这两种成员是可以被继承的 ; 父类的 " 私有成员 " 是无法被子类 继承 和 访问 的 ; 父类的 私有成员

98410

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

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

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

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

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

    2.4K20

    私有成员是否会被继承

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

    1.2K31

    【C++】继承 ⑨ ( 继承中成员变量同名的处理方案 )

    一、继承中成员变量同名的处理方案 1、继承中成员变量同名的场景说明 子类 继承 父类 的 成员 , 如果 子类 中定义了 与 父类成员变量 同名的 变量 , 子类 仍然 可以 继承 父类的 同名 成员变量...; 子类的成员变量 与 继承自父类成员变量 的 名称 出现相同的情况 , 使用 域作用符 :: 对同名的 成员变量 进行区分 ; 2、使用域作用符区分同名成员变量 子类中使用 域作用符 :: 处理同名成员变量的方案...: 继承自父类的成员变量 , 使用 父类名称::成员变量名称 替代 成员变量名称 , 如 : Parent 是父类名称 variable 是父类中的变量名称 如果子类中也定义了 variable...:b 访问 继承自父类的 b 成员 , 通过 Child::b 访问 子类自己定义的 b 成员 ; 此外 , 还可以直接使用 b 访问 子类自己定义的 b 成员 ; class Child : public...成员变量 ; Child child; // 访问 子类对象 child 中 继承自 父类的 b 成员 child.Parent::b = 10; 完整代码示例 : #include "iostream

    42720

    【C++课程学习】:继承:默认成员函数

    默认构造函数(这里指的是编译器生成的构造函数): 首先来看看,如果我们在子类中不显式写构造函数,看看编译器生成的默认构造会干什么事情(环境:VS2022): 我们可以把子类的成员分成三类: 1.父类的成员...从VS2022中可以看出,如果不写字类的默认构造函数,那么编译器生成的默认构造函数做了: 1.调用父类的构造函数,对父类成员进行初始化。 2.内置类型不做处理。(有些环境可能会初始化为0)。...: 友元关系不能继承,父类的友元不能访问子类的私有成员。...继承和静态成员: 如果父类定义了静态成员,那么在整个继承体系中,就只有这样一个成员,不管派生出多少个子类,都只有一个。 菱形继承: 单继承:一个子类只有一个直接父类时称这个继承关系为单继承。...菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。 在Assistant的对象中Person成员会有两份。

    8310

    【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)

    本篇文章,作者将和大家深入探讨C++中的继承机制。 一、什么是继承 继承(inheritance)是面向对象编程当中实现代码复用最重要的手段。...实际上,继承方式与访问限定符共同决定了派生类访问基类成员的权限: 对于继承方式,需要注意以下几点: 1. 无论以什么方式继承,基类的私有成员在派生类当中都是无法访问的。...这里的“无法访问”并不是指基类私有成员没有继承到派生类当中,而是语法限制导致不能访问。 2. 如果想要基类成员在派生类当中可以访问,而在类外无法访问,就将其设置为保护成员。 3....方法1:将基类的构造函数设置为私有成员,那么派生类就无法调用基类的构造函数,无法实例化出对象。...方法2:使用c++11新关键字final,限制该类不能被继承: class A final 六、继承与友元 基类的友元不能访问派生类的私有和保护成员。 也就是说,友元关系不能被继承。

    25110

    【C++】继承 ⑩ ( 继承机制中的 static 静态成员 | 子类中访问父类静态成员的方法 )

    一、继承机制中派生类中的 static 关键字 1、子类继承父类静态成员 子类继承父类静态成员 : 父类 ( 基类 ) 中 使用 static 关键字 定义的 静态成员变量 , 可以被所有的 子类 (...不变 , 共有 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; 父类中的 public 成员 仍然是 public 成员 ; 父类中的 protected 成员 仍然是 protected...和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; 父类中的 public 成员 变为 子类中的 protected 成员 ; 父类中的 protected 成员 仍然是 protected...成员 ; 父类中的 private 成员 仍然是 private 成员 ; private 私有继承 : 父类成员 在 子类 中 , 所有成员的访问控制权限 变为 private , 基类的 所有成员...; 或 对象名.静态成员名 child.c = 30; 的方式 , 访问 继承自 父类的 静态成员 ; 4、静态成员使用要点 参考 【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 |

    54910

    【C++】继承 ⑤ ( public 公有继承 - 示例分析 | protected 保护继承 - 示例分析 | private 私有继承 - 示例分析 )

    私有继承 , 基类 的 公有成员 和 保护成员 变为 派生类的 私有成员 , 这两种成员在 派生类内部是可以访问的 , 在 类外部 不可访问 ; 一、public 公有继承 - 示例分析 ---- 1、...//child.b; 访问 私有变量 c : 基类中的私有成员 , 保护继承 子类中仍是 私有成员 , 不可在类外部访问 ; // 不可访问 : 基类中的私有成员 // 保护继承..."); return 0; } 三、private 私有继承 - 示例分析 ---- 1、private 私有继承 private 私有继承 : 父类成员 在 子类 中 , 所有成员的访问控制权限...// 私有继承 子类中 的私有成员 , 不可在类外部访问 //child.b; 访问 私有变量 c : 基类中的私有成员 , 私有继承 子类中仍是 父类的私有成员 , 不可在类外部访问...// 私有继承 子类中 的私有成员 , 不可在类外部访问 //child.b; // 不可访问 : 基类中的私有成员 // 私有继承 子类中仍是 私有成员 , 不可在类外部访问

    21640

    【C++】继承——切片、隐藏、默认成员函数、菱形

    这里的不可见是指父类的私有成员被继承到了子类对象中,但是语法上限制子类对象不管在类里面还是类外面都不能去访问它。...可以看出保护成员限定符是因继承才出现的。 3.实际上面的表格我们进行一下总结会发现,父类的私有成员在子类都是不可见。...我们前面所说的实际上都是单继承,单继承:一个子类只有一个直接父类时称这个继承关系为单继承 然而,对于C++而言,还有多继承,多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 而菱形继承是多继承比较特殊的情况...优先使用对象组合有助于你保持每个类被封装 ---- 九、结语 C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。...所以一般不建议设计出多继承,一定不要设计出菱形继承 定义一个不能被继承的类 1.构造私有 class A { private: A() {} }; class B:public A { }; int

    43830

    C++:40---继承中类成员的变化关系

    一、派生类继承基类成员的规则 ①派生类继承了基类的所有数据成员与函数(不论公有成员、保护成员、私有成员) ②派生类虽然继承了基类的所有成员,但是能不能访问基类的成员还与父类成员的属性(public、protected...、private)以及继承方式有关 ③类静态成员:如果基类定义了一个静态成员,那么该静态成员在整个继承体系中都存在。...该静态成员只能定义一次,派生类不能再次定义 一个类改变了静态成员的值,整个继承体系中的值都将改变 #include using namespace::std; class A {...class B :public A { public: int b_data; B(int data) :A(data), b_data(data) {} void showB(){} }; 可以看到B公有继承于...A,B可以在类内访问父类A的所有public、protected成员,但不能访问private成员 由于父类的protected成员在子类中也是protected的,所以不能在外部直接使用 ?

    55310

    《C++多继承之同名成员函数调用策略:破解复杂继承体系的密码》

    在 C++的编程世界中,多继承为我们提供了强大的代码复用和功能扩展能力。然而,当多个基类中存在同名成员函数时,如何准确地调用特定的一个就成为了一个颇具挑战性的问题。...本文将深入探讨 C++中多继承情况下,多个基类有同名成员函数时的调用策略,为你揭示这一复杂场景下的解决方案。 一、多继承带来的挑战与机遇 多继承允许一个派生类从多个基类继承成员变量和成员函数。...二、同名成员函数的调用问题 考虑以下的 C++代码示例: cpp 复制 class Base1 { public: void print() { std::cout << “Base1::print...五、总结 在 C++中多继承情况下,多个基类有同名成员函数时,我们可以使用作用域解析运算符、虚函数或者类型转换来调用特定的一个。...通过合理地运用这些方法,我们可以有效地解决多继承中的同名成员函数调用问题,充分发挥多继承的优势,构建出更加灵活和强大的 C++程序。

    9910

    C++继承中的同名成员处理方式与同名静态成员处理方式

    继承同名成员处理方式 问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?...访问子类同名成员 直接访问即可 访问父类同名成员 需要加作用域 示例: 成员变量 class Base { public: Base() { m_A = 100; } public:...,子类会隐藏父类中所有版本的同名成员函数 //如果想访问父类中被隐藏的同名成员函数,需要加父类的作用域 void func() { cout 成员 当子类与父类拥有同名的成员函数,子类会隐藏父类中所有的同名成员函数,加作用域可以访问到父类中同名函数 继承同名静态成员处理方式 问题:继承中同名的静态成员在子类对象上如何进行访问...静态成员和非静态成员出现同名,处理方式一致 访问子类同名成员 直接访问即可 访问父类同名成员 需要加作用域 示例: 同名成员属性 class Base { public: static int

    50330

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

    一、继承 C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。...} (二)、公有/私有/保护成员 在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。...(四)、接口继承与实现继承 我们将类的公有成员函数称为接口。 公有继承,基类的公有成员函数在派生类中仍然是公有的,换句话说是基类的接口成为了派生类的接口,因而将它称为接口继承。...实现继承,对于私有、保护继承,派生类不继承基类的接口。派生类将不再支持基类的公有接口,它希望能重用基类的实现而已,因而将它称为实现继承。...try不能调用MakeFinal的私有成员,因此引发编译错误。

    1.1K00

    C++继承(多继承、菱形继承?)

    这里的不可见指的是父类的私有成员还是被继承到了子类对象中,但是语法上限制了子类对象不管在类里面还是类外卖呢都不能去访问父类的 private 成员。...③ 实际上,上面的表格我们通过观察不难发现,父类的私有成员在子类都是不可见的,父类的其他成员在子类的访问方式 == Min(成员在父类的访问限定符,继承方式): 也就是说,类成员和继承方式里面的权限,...继承与友元 友元关系不能继承,也就是说 父类友元不能访问子类私有和保护成员! 相当于你爹的朋友不一定是你的朋友!...继承的总结和反思 很多人说 C++ 语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。...多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 虽然虚继承解决了菱形继承的坑,但是也付出了一定的代价: 对象模型更加复杂,学习成本更高了 有一定的效率影响

    2K20

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

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

    38910

    【C++】继承(定义、菱形继承、虚拟继承)

    继承关系和访问限定符 继承基类成员访问方式的变化 记忆方法:基类的私有成员,无论哪种方式继承,在派生类中都是不可见。基类其他成员在子类的访问方式,取基类成员的访问限定符和继承方式中小的一个。...在继承中,一般用公有和保护,少用私有。 总结: 基类private成员在派生类中无论以什么方式继承都是不可见的。...实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。...注意:必须是公有继承才可以,保护和私有都不行。 public继承是is -a的关系,即每个子类对象都是一个特殊的父类对象。 派生类对象可以赋值给 基类的对象 / 基类的指针 / 基类的引用。...而父类成员可以看作是一个自定义类型成员,会回去父类找默认构造函数。 继承与友元 友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员 。

    15610

    【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 方法 | 类内部访问私有成员 )

    一、访问私有成员 1、对象无法访问私有变量 在下面的 Python 类 Student 中 , 定义了私有的成员变量 , # 定义私有成员 __address = None 该私有成员变量..., 只能在类内部进行访问 , 类的外部无法进行访问 ; 在 类外部 创建的 Student 实例对象 , 是无法访问 __address 私有成员的 ; 使用 实例对象 访问 类的私有成员 , 编译时不会报错...Tom 18 Process finished with exit code 1 2、对象无法访问私有方法 在类中 定义私有成员方法 # 定义私有成员方法 def __say(self...在 Student 类中 , 定义了 私有成员变量 和 私有成员方法 : # 定义私有成员 __address = None # 定义私有成员方法 def __say...__say() # 定义私有成员 __address = None # 定义私有成员方法 def __say(self): print(f"address

    28320

    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) {} 但我们这个例子当中用的是私有继承

    26810

    【C++】继承

    C++里面呢也有继承的概念,那C++的继承我们该如何去理解呢? 1.1 继承的概念 其实不仅在C++这门语言里有继承的概念,大多数面向对象的语言都支持继承。...相信说到这里,大家对于C++中继承的概念已经有了一定的理解了,那继承的语法是怎样的呢?我们如何去定义一个继承类呢?...1.2.3 继承后成员访问方式的变化 我们来看一张表格 private成员的继承 那对于这张表格其实我们总结一下会发现: 基类的私有private成员在子类都是不可见的(无论以什么方式被继承)。...所以什么时候我可以把成员定义成私有啊,除了我不想在类外被访问到: ,是不是如果我当前类的某些成员不想被子类使用和访问,也可以把它定义成私有啊。...继承与友元 友元关系不能继承,也就是说父类的友元不是子类的友元,不能访问子类私有和保护成员。

    14610
    领券