派生类

C++三种继承方式

一笑奈何 提交于 2020-01-06 15:38:36
public: 公有继承时,对基类的公有成员和保护成员的访问属性不变,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。派生类的对象只能访问派生类的公有成员(包括继承的公有成员),访问不了保护成员和私有成员。 protected: 保护继承中,基类的公有成员和保护成员被派生类继承后变成保护成员,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。派生类的对象不能访问派生类继承基类的公有成员,保护成员和私有成员。 private: 私有继承时,基类的公有成员和保护成员都被派生类继承下来之后变成私有成员,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。派生类的对象不能访问派生类继承基类的公有成员,保护成员和私有成员。 总结: 不管是哪种继承方式,派生类中新增成员可以访问基类的公有成员和保护成员,无法访问私有成员。而继承方式影响的是派生类继承成员访问属性,而使用友元(friend)可以访问保护成员和私有成员。 链接: https://blog.csdn.net/sxtdzj/article/details/81906504 来源: https://www.cnblogs.com/NiBosS/p/12152272.html

c++学习笔记_5

岁酱吖の 提交于 2020-01-05 04:41:22
前言:本笔记所对应的课程为中国大学mooc中北京大学的 程序设计与算法(三)C++面向对象程序设计 ,主要供自己复习使用,且本笔记建立在会使用c和java的基础上,只针对与c和java的不同来写 继承 继承和派生的基本概念 c++中的继承和派生是同一概念,其基本定义和用法与java中的类似 与java中相对应的,父类叫做基类,子类叫做派生类 写法: “class 派生类名: public 基类名” 派生类对象的内存空间中包含着基类对象,且基类对象的储存位置位于派生类对象新增的成员变量之前。 继承关系和复合关系 较简单,略。 覆盖和保护成员 覆盖:定义:派生类中可以定义一个和基类成员同名的成员。使用作用域符号 :: 可以访问基类中的同名成员,不使用作用域符号则访问派生类中成员。 基类的protected成员可被下列函数访问: 基类的成员函数 基类的友元函数 派生类的成员函数可访问 当前对象 的基类的保护成员(这一点是相对于private多出来的) 派生类的构造函数 派生类的参数初始化方法:调用基类的构造函数。在执行一个派生类构造函数之前,总是先执行基类的构造函数。 具体写法:有两种,第一是显示方式,在派生类的构造函数的初始化列表中,直接调用基类的构造函数;第二是隐式方式,如果省略不写基类构造函数,则会自动调用基类的无参构造函数(没有无参构造函数时会编译出错)。

C/C++ 复习

末鹿安然 提交于 2020-01-05 04:23:10
本文总结一下C++面试时常遇到的问题。C++面试中,主要涉及的考点有 关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, new, delete等等 语法问题 类型转换 指针以及指针和引用的区别 面向对象的相关问题,如虚函数机制等 泛型编程的相关问题,如模板和函数的区别等 内存管理,如字节对齐(内存对齐)、动态内存管理、内存泄漏等 编译和链接 实现函数和类 本文不涉及STL的内容,有关STL的内容,会另有一篇文章专门总结。 零、序章 0.1 C++与C的对比 C++有三种编程方式:过程性,面向对象,泛型编程。 C++函数符号由 函数名+参数类型 组成,C只有函数名。所以,C没有函数重载的概念。 C++ 在 C的基础上增加了封装、继承、多态的概念 C++增加了泛型编程 C++增加了异常处理,C没有异常处理 C++增加了bool型 C++允许无名的函数形参(如果这个形参没有被用到的话) C允许main函数调用自己 C++支持默认参数,C不支持 C语言中,局部变量必须在函数开头定义,不允许类似for(int a = 0; ;;)这种定义方法。 C++增加了引用 C允许变长数组,C++不允许 C中函数原型可选,C++中在调用之前必须声明函数原型 C++增加了STL标准模板库来支持数据结构和算法 一

sealed、new、virtual、abstract与override 总结

五迷三道 提交于 2020-01-03 23:14:12
1. sealed——“断子绝孙” 密封类不能被继承。密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed修饰符必须始终与override一起使用。 即:密封类不会有子类,所以是“断子绝孙”。 2. new——“你是我的,我是我的” new关键字用于显式隐藏从基类继承的成员。也就是在使用派生类时调用的方式方法是new关键字新定义出来的方法,而不是基类的方法。 在不使用new修饰符的情况下隐藏成员是允许的,但会生成警告。使用new显式隐藏成员会取消此警告,并使用派生类新定义的方法。 即:好比是不用祖宗的东西,而是用自己创造(new)的东西。 3. virtual——“为了子孙后代” virtual关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称做虚成员。虚成员的实现可由派生类中的重写成员更改。 调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。 在默认情况下,方式是非虚拟的。非虚方法不能重写。 不能将virtual修饰符与一下修饰符一起使用:static、abstract和override。 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。 在静态属性上使用virtual修饰符是错误的。 通过override修饰符的属性声明

sealed、new、virtual、abstract与override 总结

断了今生、忘了曾经 提交于 2020-01-03 23:13:39
1. sealed——“断子绝孙” 密封类不能被继承。密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed修饰符必须始终与override一起使用。 即:密封类不会有子类,所以是“断子绝孙”。 2. new——“你是我的,我是我的” new关键字用于显式隐藏从基类继承的成员。也就是在使用派生类时调用的方式方法是new关键字新定义出来的方法,而不是基类的方法。 在不使用new修饰符的情况下隐藏成员是允许的,但会生成警告。使用new显式隐藏成员会取消此警告,并使用派生类新定义的方法。 即:好比是不用祖宗的东西,而是用自己创造(new)的东西。 3. virtual——“为了子孙后代” virtual关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称做虚成员。虚成员的实现可由派生类中的重写成员更改。 调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。 在默认情况下,方式是非虚拟的。非虚方法不能重写。 不能将virtual修饰符与一下修饰符一起使用:static、abstract和override。 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。 在静态属性上使用virtual修饰符是错误的。 通过override修饰符的属性声明

sealed、new、virtual、abstract与override

那年仲夏 提交于 2020-01-03 23:13:13
1. sealed——“断子绝孙” 密封类不能被继承。密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed修饰符必须始终与override一起使用。 即:密封类不会有子类,所以是“断子绝孙”。 2. new——“你是我的,我是我的” new关键字用于显式隐藏从基类继承的成员。也就是在使用派生类时调用的方式方法是new关键字新定义出来的方法,而不是基类的方法。 在不使用new修饰符的情况下隐藏成员是允许的,但会生成警告。使用new显式隐藏成员会取消此警告,并使用派生类新定义的方法。 即:好比是不用祖宗的东西,而是用自己创造(new)的东西。 3. virtual——“为了子孙后代” virtual关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称做虚成员。虚成员的实现可由派生类中的重写成员更改。 调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。 在默认情况下,方式是非虚拟的。非虚方法不能重写。 不能将virtual修饰符与一下修饰符一起使用:static、abstract和override。 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。 在静态属性上使用virtual修饰符是错误的。 通过override修饰符的属性声明

单继承、多继承、菱形继承的虚函数表

自古美人都是妖i 提交于 2020-01-01 13:06:49
文章目录 前言 问题 测试环境 开始测试 无虚函数简单类结构 包含虚函数的类结构 单继承 多继承 菱形继承 虚继承 总结 前言 最近被问到一个关于多继承虚函数表的问题,当时回答是可能存在多个虚函数表,应该是顺序排列的,但具体怎么排列还是有些疑惑的,回答的时候到有点儿心虚。之后查了资料,做了简单的实验,可以确定的是对于继承了多个含有虚函数基类的子类来说,指向虚函数表的指针应该不止一个。 问题 虚函数表的问题是从C++多态的概念引出的,要想实现多态有3个条件: 存在继承:没有继承就没有多态(运行时),在多态中必须存在有继承关系的父类和子类。 重写函数:父类中需要定义带有 virtual 关键字的函数,而在子类中重写一个名字和参数与父类中定义完全相同的函数。 向上转型:将父类的指针和引用指向子类的对象。 满足以上三个条件,当使用父类的指针调用带有 virtual 关键字的函数时,就会产生多态行为。 实现这种多态表现的核心内容就是虚函数表,对于带有 virtual 关键字的函数地址会被放入一个表格,而在类中会有一个指向虚函数表的指针指向这个表格,表明这个表格属于类的一部分。 对于父类来说,这个表格中都是自己类的虚函数,而对于子类来说,首先这个虚函数表包含父类中所有的虚函数,当子类重写某个虚函数时就会用子类重写后的函数地址替换原来父类中定义的函数地址

转:c++ 基类转换为派生类

ε祈祈猫儿з 提交于 2019-12-31 00:38:32
基类类型的 引用或指针 既可以引用基类对象,也可以引用派生类对象 , 但编译器只把它当做基类类型对象 。 #include <iostream> using namespace std; class base { public: base():cat(0){} void print() { cout << "cat" << cat << endl; } private: int cat; }; class derive:public base { public: derive():base(),dog(1){} //这里base()可以不用写,默认调用无参构造函数 void print() { cout<< "dog" << dog << endl; } private: int dog; }; int main() { base A; base *p; derive B; p = &A; p->print(); p = &B; p->print(); return 0; } 会输出cat0 cat0 可以看出两个都调用了基类对象的print 函数。 但是派生类的引用转换不同于转换对象 。将派生类对象传给基类的引用,引用直接绑定该对象对象本身未被复制。 将派生类对象传给希望接受基类类型的对象(非引用),则派生类对象的基类部分被复制到基类形参 #include <iostream>

public/private/protected 的区别

懵懂的女人 提交于 2019-12-29 20:35:46
具体区别: 在说明这四个关键字之前,就class之间的关系做一个简单的定义,对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes,认为都是自己的朋友。 1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用 2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。 3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。 派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。 我们可以根据访问权限总结出不同的访问类型,如下所示: 一个派生类继承了所有基类的方法,但下列情况除外: *基类的构造函数、析构函数和拷贝构造函数(可能是为了多继承定义不出现冲突) *除了赋值运算符重载函数以外,所有的运算符重载函数都可以被派生类继承。 (原因:“赋 值运算符重载函数”不是不能被派生类继承,而是被派生类的默认“赋值运算符重载函数”给 覆盖了。这就是 C++赋值运算符重载函数不能被派生类继承的真实原因! )

【C++】public,private,protected

岁酱吖の 提交于 2019-12-25 18:16:48
公有成员public member 在程序的任何地方都可以被访问实行信息隐藏的类将其public 成员限制在成员函数上这种函数定义了可以被一般程序用来操纵该类类型对象的操作 私有成员private member 只能被成员函数和类的友元访问实行信息隐藏的类把其数据成员声明为private 被保护成员protected member 对派生类derived class 就像 public 成员一样对其他程序则表现得像private 在类的private:节中声明的成员(无论数据成员或是成员函数)仅仅能被类的成员函数和友元访问。 在类的protected: 节中声明的成员(无论数据成员或是成员函数)仅仅能被类的成员函数,友元以及子类的成员函数和友元访问。 在类的public:节中声明的成员(无论数据成员或是成员函数)能被任何人访问。 public、private或proteced,它们控制变量成员和成员函数在类内和类外如何访问。所谓类内访问是指用类的成员函数进行访问,而类外访问是指用对象或指向对象的指针进行访问。 当一个类的成员定义为public,就能够在类外访问,包括它的派生类。 当一个成员定义为private,它仅能在类内访问,不能被它的派生类访问。 当一个成员定义为proteced,它仅能在类内访问,但是能被它的派生类访问。 当一个成员没有指定访问说明符时,默认为private。