《深入浅出MFC》2/ebased, event driven, multitasking, multithreading, console programming。 ■ C++ 重要技术:类别与对象、this 指针与继承、静态成员、虚拟函数与多态、 深入淺出 MFC 28 模板(template)类别、异常处理(exception handling)。 ■ MFC 六大技术之简化仿真(Console 程序) 但不十分熟悉,你可以一边复习C++ 一边学习MFC,这也是 我所鼓励的方式(很多人是为了使用MFC 而去学习C++ 的)。C++ 语言的继承 (inheritance)特性对于我们使用MFC 尤为重要,因为使用MFC 就是要继承各个类别 并为己用。所以,你应该对C++ 的继承特质(以及虚拟函数,当然)多加体会。我在 第2章安排了一些C++ 的必要基础。我所挑选的题目都是本书会用到的技术,而其深 度你不见得能够在一般C++ override 多载 overloading,亦有他书译为「过荷」 封装 Encapsulation 继承 Inheritance 动态绑定 Dynamic Binding,亦即后期绑定(late binding) 虚拟函数0 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 IObject 一切对象的公共基类。 • INode 一切节点的公共基类。 多态的经典案例 • IObject 具有一个 eatFood 纯虚函数,而 CatObject 和 DogObject 继承自 IObject ,他 们实现了 eatFood 这个虚函数,实现了多态。 • 注意这里解构函数( ~IObject )也需要是虚函数 ,否则以 IObject * 存储的指针在 delete struct Derived : Base> {}; CRTP 的改进:如果基类还想基于另一个类 • 现在我们的需求有变,需要新增一个“超狗 (superdog)” 类,他继承自普通狗 (dog) 。 • 这时我们可以给 IObjectClone 新增一个模板参数 Base ,其默认值为 IObject 。 • 这样当用户需要的时候就 • 可指定第二个参数 Base Vec3IGrid , IntGrid , PointsDataGrid • 我们并不知道他们之间的继承关系,可能有也可能没有。但是在 Zeno 中,我们必须有。 • 他们还有一些成员函数,这些函数可能是虚函数,也可能不是。 • 如何在不知道 OpenVDB 每个类具体继承关系的情况下,实现我们想要的继承关系,从而 实现封装和代码重用?简单,只需用一种被小彭老师称为类型擦除 (type-erasure) 0 码力 | 54 页 | 3.94 MB | 1 年前3
现代C++ 教程:高速上手C++11/14/17/20委托构造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 继承构造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 显式虚函数重载 std::cout << b.value2 << std::endl; } 29 2.6 面向对象 第 2 章语言可用性的强化 继承构造 在传统 C++ 中,构造函数如果需要继承是需要将参数一一传递的,这将导致效率低下。C++11 利 用关键字 using 引入了继承构造函数的概念: #includeclass Base { public: int value1; Base() 构造函数 value2 = value; } }; class Subclass : public Base { public: using Base::Base; // 继承构造 }; int main() { Subclass s(3); std::cout << s.value1 << std::endl; std::cout << s.value2 << 0 码力 | 83 页 | 2.42 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战CUDA 表面对象:封装 • 要访问一个多维数组,必须先创建一个表面对象 ( cudaSurfaceObject_t )。 • 考虑到多维数组始终是需要通过表面对象来访问的,这 里我们让表面对象继承自多维数组。 • 在核函数中可以用 surf3Dread 和 surf3Dwrite 来读写 表面对象中的元素, x,y,z 参数指定要访问元素的坐标 ,要注意 x 必须乘以 sizeof( 元素类型0 码力 | 58 页 | 14.90 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程比如,利用重载实现“将一个数乘以 2” 这个 功能,需要: 为什么面向对象在 HPC 不如函数式和元编程香了? 这个例子要是按传统的面向对象思想,可能是这样: 令 Int, Float, Double 继承 Numeric 接口类并实现 ,其中 multiply(int) 作为虚函数。然后定义: Numeric *twice(Numeric *t) { return t->multiply(2); }0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串_Alloc_hider )的大小也是 n ,不会变成 n + 1 。 • 所以这就是为什么 GCC 标准库把成员变量 _M_p 挪到了一个 _Alloc_hider 里,而 让 _Alloc_hider 又继承 allocator 。就是为了在 allocator 为空类的时候(无状态分 配器),能让 allocator 不必占据额外的空间。 • 问题:既然 allocator 往往都是个空类( std::allocator0 码力 | 162 页 | 40.20 MB | 1 年前3
Hello 算法 1.0.0b1 C++版成内存空间的 浪费。 为了解决此问题,诞生了一种被称为「列表 List」的数据结构。列表可以被理解为长度可变的数组,因此也常 被称为「动态数组 Dynamic Array」。列表基于数组实现,继承了数组的优点,同时还可以在程序运行中实时 扩容。在列表中,我们可以自由地添加元素,而不用担心超过容量限制。 4.3.1. 列表常用操作 初始化列表。我们通常会使用到“无初始值”和“有初始值”的两种初始化方法。0 码力 | 187 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 C++版成内存空间的 浪费。 为了解决此问题,诞生了一种被称为「列表 List」的数据结构。列表可以被理解为长度可变的数组,因此也常 被称为「动态数组 Dynamic Array」。列表基于数组实现,继承了数组的优点,同时还可以在程序运行中实时 扩容。在列表中,我们可以自由地添加元素,而不用担心超过容量限制。 4.3.1. 列表常用操作 初始化列表。我们通常会使用到“无初始值”和“有初始值”的两种初始化方法。0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b4 C++版数组;若长度过大,则会造成内存空间的浪费。 为解决此问题,出现了一种被称为「动态数组 Dynamic Array」的数据结构,即长度可变的数组,也常被称 为「列表 List」。列表基于数组实现,继承了数组的优点,并且可以在程序运行过程中动态扩容。在列表中, 我们可以自由添加元素,而无需担心超过容量限制。 4.3.1. 列表常用操作 初始化列表。通常我们会使用“无初始值”和“有初始值”的两种初始化方法。0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 C++ 版存储多少数据,从而难以选择合适的列表长度。若长度过小,则很可能无法满足使用需求;若长度过大,则 会造成内存空间浪费。 为解决此问题,我们可以使用动态数组(dynamic array)来实现列表。它继承了数组的各项优点,并且可以 在程序运行过程中进行动态扩容。 实际上,许多编程语言中的标准库提供的列表是基于动态数组实现的,例如 Python 中的 list 、Java 中的 ArrayList0 码力 | 379 页 | 18.47 MB | 1 年前3
共 13 条
- 1
- 2













