派生类

C++(2):virtual、explicit和template

谁都会走 提交于 2020-02-04 19:15:57
C++继承 : 通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。 C++继承分为三类: 公有继承 基类的公共成员和受保护成员在派生类中访问属性还是不变,在派生类中,只有基类的私有成员在派生类中不可直接访问 即派生类的访问权限:public不变、private不可见、protected不变。 私有继承 基类的公用成员和保护成员都以私人身份出现在派生类中,派生类中的其他成员可以直接访问基类的公共和保护成员 即派生类的访问权限:public和protected变为private 保护继承 基类的公用成员和保护成员都以保护身份出现在派生类中。 即派生类访问权限:public变成protected、protected不变 举个例子:比如在之前引入联合体的学校信息管理系统,在学校信息分为职工信息和学生信息,两者信息有相同的部分,也有不同的部分,我们把相同的部分作为基类,把两者不同的部分作为两个不同的派生类,这样就可以满足两种需求。 class information { public : information ( char a , char b , int c ) { name = a ; sex = b ; age =

如何保证delete this有效?

南笙酒味 提交于 2020-01-31 23:53:26
我们需要使用到所谓的抽象混合式基类,所谓的抽象指该类至少含有一个纯虚函数,所谓的混合是指该类提供一组定义完好的接口,而该套接口与其派生类所可能提供的其他任何能力兼容。于是我们可以形成一个所谓的抽象混合式基类用来为派生类提供判断delete this是否有效的能力。实现如下 heapTracked.h # pragma once # include <list> using namespace std ; class HeapTracked { public : class MissingAddress { } ; virtual ~ HeapTracked ( ) = 0 ; static void * operator new ( size_t size ) ; static void operator delete ( void * ptr ) ; bool isOnHeap ( ) const ; private : static list < const void * > address ; } ; heapTracked.cpp # include "heapTracked.h" list < const void * > HeapTracked :: address ; HeapTracked :: ~ HeapTracked ( ) { } void *

类的概念及品种(ing)

对着背影说爱祢 提交于 2020-01-31 17:38:28
虚函数: 在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。 纯虚函数: 在声明虚函数时被“初始化”为0的函数。 抽象类 :至少包含一个纯虚函数的类。 虚析构函数 :释放派生类的对象。 C++规定,当一个成员函数被声明为虚函数之后,其派生类中的同名函数都自动成为虚函数。记住 来源: CSDN 作者: 泰乐熊 链接: https://blog.csdn.net/xiong3110/article/details/87428461

C++类的继承与派生

孤街浪徒 提交于 2020-01-29 15:06:18
  C++中,继承就是在一个已存在的类的基础上建立一个新的类。已存在的类称为基类,又称父类;新建立类称为派生类,又称为子类。   基类是对派生类的抽象,派生类是对基类的具体化。 (一)派生类的定义与构成 1)派生类的定义   class 派生类名:类派生列表{     成员列表   };   类派生列表指定了一个或多个基类,形式如下:   访问权限标号 基类名1,访问权限标号 基类名2,... 2)派生类的构成   派生类由两部分组成:第一部分是从基类继承得到的,另一部分是自己定义的新成员,这些成员仍然分为三种访问属性。   注意,友元关系是不能继承的:一方面,基类的友元对派生类成员没有特殊的访问权限;另一方面,如果基类被授予了友元关系,则只有基类有特殊访问权限,该基类的派生类不能访问授予友元关系的类。   实际编程中,设计一个派生类包括三个方面工作:   a)从基类接收成员。   除了构造函数与析构函数之外,派生类会把基类的全部成员继承过来。   b)调整基类成员的访问。   程序员可以对接收的成员指定访问策略。   c)在定义派生类时增加新的成员。另外还应该自己定义派生类的构造函数和析构函数,因为它们不能从基类继承过来。 (二)派生类成员的访问   不同的继承方式决定了基类成员在派生类中的访问属性 1)公有继承   基类的公有成员和保护成员在派生类中保持原有访问属性

C++知识点汇总文档

蓝咒 提交于 2020-01-29 03:14:26
C++知识点汇总文档 持续更新 朝花夕拾. 不写下来, 仿佛一切都没了见证. 编程来源于生活, 无非是对现实的抽象. 整理这份文档的时候我才发现, 自己对C++的了解无非是冰山一角 另, C++11真的 太恐怖了 , 新"特性"真的是"恐怖如斯" 另注: 本人才疏学浅, 难免有错漏之处, 还望不吝赐教 1.基本概念 内存管理 C++中的内存划分(内容来自 博客 ): 堆 由用户使用new delete关键字管理的内存区域 栈 栈中用来存放临时变量, 比如函数中的局部变量, 在代码块结束时会自动清除 自由存储区 由malloc等分配的内存块, 他和堆是十分相似的, 不过它是用free来结束自己的生命的 全局/静态存储区 全局变量和静态变量被分配到同一块内存中 常量存储区 比较特殊的存储区, 他们里面存放的是常量(不太了解, 有空扫下盲) new 关键字 用来在内存(堆)中开辟一块空间, 用户获得一个指向内存中目标位置的指针 用法 参考示例 //申请一块指向单个int对象的内存, 并将值初始化为"5" int *ptr_0 = new int(5); //申请一块指向5个连续int类型对象的内存 //使用C++11统一的花括号初始化, 直观地对内存进行初始化 int * ptr_1 = new int[5]{1,2,3,4,5}; delete 关键字 删除 使用new申请的内存 用法

派生类成员函数调用时 error C2248: 无法访问 protected 成员 的排雷之路

孤人 提交于 2020-01-28 20:02:37
工作需要自定义一个控件,结果调用成员函数总是报错! 如下图: 理论上继承关系和函数权限public都没有问题,可是只要一使用自定义的成员函数就会报error C2248: 无法访问 protected 成员 ,查了很久资料,总算试出了解决方案,就是加强制声明public:即在成员函数声明时强制在前面加public:,对于上例就是在自定义SetTextEx前面加。如图: 原因分析: 语法上没有问题就可能是编译器编译时默认给继承类的成员函数都默认加了protected 的属性,虽然是放在public区域,可是编译时还是默认被编译成了protected 的函数,所以在函数前加入public:强制绑定成public类型的就能正常编译使用了。希望能帮后来者节省点排雷时间。 来源: 51CTO 作者: 对刘谈琴 链接: https://blog.51cto.com/13243359/2468500

密封类(sealed)

≯℡__Kan透↙ 提交于 2020-01-23 14:10:38
密封类 sealed 密封类不能用作基类。因此,它也不能是抽象类。密封类主要用于防止派生。由于密封类从不用作基类,所以有些运行时优化可以使对密封类成员的调用略快。 public sealed class seleg { } 在对基类的虚成员进行重写的派生类上的类成员、方法、字段、属性或事件可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的虚效果。方法是在类成员声明中将 sealed 关键字置于 overrride关键字的前面。例如: public class selegc: seleg {   public sealed override void DoWork()   {   } } 来源: https://www.cnblogs.com/wujiang/archive/2010/08/13/1799334.html

利用继承性与派生类来管理学生和教师档案。

泪湿孤枕 提交于 2020-01-23 01:44:53
利用继承性与派生类啦管理学生和教师档案。假设要管理下述几类人员的如下一些数据。 teacher(教师)类:姓名、性别、年龄、职称、担任课程; student(学生)类:姓名、性别、年龄、学号、系别; gradstudent(研究生)类:姓名、性别、年龄、学号、系别、导师。 要求每个类只设立构造函数以及显示类对象数据的成员函数。编写主函数,说明有关类对象,并对其类成员函数进行简单测试。用UML图画出类及其关系。 画出UML图: 2.编写父类Person类,代码如下所示: package day1; public class Person { public String name; public String sex; public int age; public void showInfo() { System.out.println("姓名:"+name); System.out.println("性别:"+sex); System.out.println("年龄:"+age); } } 3.编写Teacher类继承person类,代码如下图所示: package day1; public class Teacher extends Person{ String name="王刚"; String sex="男"; int age=23; String job="班主任";

第十四章 C++中的代码重用

旧巷老猫 提交于 2020-01-22 21:29:55
C++提供了下面几种代码重用的手段: 1. 继承( 公有继承 (is-a)、 私有继承和保护继承 (has-a)); 2. 包含/层次化/组合 (has-a); 3. 多重继承 4. 类模板 继承了实现就是继承了数据成员,继承了接口就是继承了成员函数。 接口 ( 派生类对象可以使用基类的方法 ) 和实现 ( 派生类对象存储了基类的数据成员, 实现 即为可以对数据成员进行操作(通过成员函数) ) 使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现)。获得接口是is-a关系的组成部分。而使用组合,类可以获得实现,但不能获得接口。不获得接口是has-a关系的组成部分。 虽然has-a关系的继承没有继承基类的接口,但可以在派生类的成员函数内部使用基类名和作用域运算符来访问基类方法。 私有继承 使用私有继承,基类的私有成员、保护成员都将成为派生类的私有成员。这意味着,基类方法不会成为派生类对象公有接口的一部分,但可以在派生类的成员函数中使用它们。 ‘包含‘ 将对象作为一个命名的成员对象添加到类中;而私有继承将对象作为一个未被命名的继承对象添加到类中。 私有继承的技术: 1. 初始化基类组件 构造函数使用成员初始化列表,使用类名而不是成员名来表示构造函数。 每一个继承的基类只对应一个成员对象。 2. 访问基类的方法 可以通过类名和作用域解析运算符来调用基类的方法

C++的那些事:面向对象

人盡茶涼 提交于 2020-01-22 20:56:10
1 OOP概述 面向对象基于三个基本概念:数据抽象、继承和动态绑定。通过使用数据抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。 1.1 继承 继承是派生类与基类之间的关系,它们共享了一些公共的东西,而派生类特化了一些本质不同的东西。类与类之间的继承关系构成了继承层次。在C++中,基类必须指定希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,需要在派生类中继承的不能定义为虚函数。 派生类重新定义的虚函数前面可以加virtual,但这不是必要的,在C++11中,允许派生类显式地注明它将使用哪个成员函数改写基类虚函数,只用在该函数形式参数列表后增加一个override关键字。 1.2 动态绑定 当函数接口定义了基类的引用(或指针)时,在函数内调用虚函数时,发生动态绑定。因为这时候函数实参可以为基类类型也可以为派生类类型, 虚函数只有在运行阶段 才能确定需要调用哪个定义。 2 定义基类与派生类 2.1 定义基类 基类成员函数中希望在派生类中重新定义的函数前面加了virtual,这类函数在调用时,在程序运行阶段确定。任何构造函数之外的非静态函数都可以是虚函数。virtual关键字只需要在基类定义的时候加在需要重定义的函数前面,实现的时候不需要。