C++ 虚继承原理剖析

虚继承解决的问题:

虚继承主要是为了解决C++的菱形继承的时候其父类的公共基类有多个副本的问题,这个问题会造成资源浪费以及一些表意不明确的问题。

虚继承具体实现原理:

一个类虚继承另一个类之后,被继承的类就叫做虚拟基类。

当使用虚继承之后,继承便不再是将父类的所有属性全盘继承下来,而是会分为一下的两部分:

  1. 一部分是虚拟基类的属性部分,该部分存储的是虚拟基类的成员属性
  2. 另一部分是一个名为vbptr的虚拟基类指针,该指针的作用是通过相应的偏移量计算来找到相应的虚拟基类的位置,并且vbptr是能够被其子类给继承的
  3. vbptr通过该类的虚拟基类表vbtable通过偏移量的方式找到虚拟基类的位置

使用visual studio 中的开发者命令行工具可以显示类的结构

例如使用非虚拟继承的一个菱形继承案例如下:

#include<iostream>
using namespace std;

class GrandFather
{
public :
	int a;
};

class Father1 : public GrandFather
{

};

class Father2 : public GrandFather
{

};
class Son :public Father1,public Father2
{

};

打开开发者工具,转到相应源文件目录。输入cl /d1 reportSingleClassLayout查看的类名 所属文件名

但是虚拟继承后:

#include<iostream>
using namespace std;

class GrandFather
{
public :
	int a;
};

class Father1 : virtual public GrandFather
{
public:
	int b;
	int c;
};

class Father2 :virtual public GrandFather
{

};
class Son :public Father1,public Father2
{

};

虚拟继承后,

虚拟基类只会有一个副本,所以只有一个a(这就是解决菱形继承问题的根本)

 总结:

  1. 虚拟继承不仅是继承父类内容,还会获得一个虚拟基类指针,用于在虚拟基类表中找到虚拟基类的位置
  2. 虚拟基类指针是能够会被子类继承的
  3. 一个类中同一个虚拟基类只会存在一个副本,不会存在多个副本

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这本经典、畅销的数据结构教材详细介绍了数据抽象的基础知识,强调作为面向对象方法基础原理的规范和实施之间的区别。书中使用的软件工程原则和概念以及UML图便于增强学生的理解。 ◆ 详细介绍了数据抽象,强调规范和实现之间的区别 ◆ 广泛介绍了各种面向对象的编程技术 ◆ 重点是核心的数据结构,而不是非必要的C++语言语法 ◆ 说明了类和ADT在问题解决过程中的作用 ◆ 诠释了ADT的主要应用,如查找航班图、事件驱动的模拟和八皇后问题 ◆ 大部分章节中的例子都使用了标准模板库(STL) ◆ 介绍了递归 ◆ 附录中提供了基本的C++语法,以帮助学生从其他语言转换为C++ 第1章 数据抽象:墙 1 1.1 面向对象的概念 2 1.1.1 面向对象分析与设计 2 1.1.2 面向对象解决方案的特征 3 1.2 获得更好的解决方案 4 1.2.1 内聚 5 1.2.2 耦合 5 1.3 规范 6 1.3.1 操作契约 7 1.3.2 特殊情况 8 1.3.3 抽象 9 1.3.4 信息隐藏 10 1.3.5 最小且完整的接口 11 1.4 抽象数据类型 12 1.4.1 设计ADT 14 1.4.2 涉及其他ADT的ADT 17 1.5 ADT包 18 1.5.1 确定行为 18 1.5.2 指定数据和操作 19 1.5.3 ADT的模板接口 22 1.5.4 使用ADT包 24 C++片段1 C++类 29 C1.1 待解决的问题 30 C1.1.1 私有数据字段 31 C1.1.2 构造函数和析构函数 32 C1.1.3 方法 32 C1.1.4 防止编译错误 33 C1.2 实现解决方案 34 C1.3 模板 35 C1.4 继承 37 C1.4.1 基类和派生类 38 C1.4.2 重写基类方法 40 C1.5 虚方法和抽象类 42 C1.5.1 虚方法 42 C1.5.2 抽象类 43 第2章 递归:镜子 45 2.1 递归解决方案 46 2.2 返回值的递归 48 2.2.1 递归值函数:n的阶乘 49 2.2.2 箱式跟踪 52 2.3 执行动作的递归 55 2.4 递归与数组 62 2.4.1 逆置数组项 63 2.4.2 折半查找 64 2.4.3 查找数组中的最大值 68 2.4.4 查找数组中第k个最小值 69 2.5 组织数据 71 2.6 更多示例 75 2.6.1 Fibonacci数列(兔子繁殖) 75 2.6.2 组织游行队伍 78 2.6.3 从n个事物中选出k个 79 2.7 递归和效率 81 第3章 基于数组的实现 91 3.1 办法 92 3.1.1 核心方法 93 3.1.2 使用大小固定的数组 93 3.2 ADT包的基于数组的实现 94 3.2.1 头文件 95 3.2.2 定义核心方法 96 3.2.3 测试核心方法 98 3.2.4 实现更多方法 101 3.2.5 删除项的方法 103 3.2.6 测试 106 3.3 在实现中使用递归 107 3.3.1 getIndexOf方法 107 3.3.2 getFrequencyOf方法 108 C++片段2 指针、多态和内存分配 113 C2.1 变量的内存分配和方法的前期绑定 114 C2.2 需要解决的问题 115 C2.3 指针与程序的自由存储 116 C2.3.1 释放内存 118 C2.3.2 避免内存泄漏 119 C2.3.3 避免悬挂指针 122 C2.4 虚方法和多态 124 C2.5 数组的动态分配 126 第4章 基于链表的实现 129 4.1 预备知识 130 4.2 ADT包的基于链表的实现 133 4.2.1 头文件 134 4.2.2 定义核心方法 135 4.2.3 实现更多方法 138 4.3 在基于链表的实现中使用递归 143 4.4 测试多个ADT实现 145 4.5 比较基于数组的实现和基于链表的实现 148 第5章 作为问题求解技术的递归 155 5.1 定义语言 156 5.1.1 语法知识基础 156 5.1.2 两种简单的语言 158 5.2 代数表达式 160 5.2.1 代数表达式的类型 160 5.2.2 前缀表达式 162 5.2.3 后缀表达式 166 5.2.4 完全括号化表达式 168 5.3 回溯 168 5.3.1 查找航线 168 5.3.2 八皇后问题 173 5.4 递归和数学归纳法的关系 179 5.4.1 递归阶乘函数的正确性 179 5.4.2 Hanoi塔的工作量 180 第6章 栈 189 6.1 ADT栈 190 6.1.1 在设计解决方案期间开发ADT 190 6.1.2 ADT栈的规范 192 6.2 栈的简单应用 197 6.2.1 检查括号匹配 197 6.2.2 识别语言中的字符串 199 6.3 栈在代数表达式中的应用 200 6.3.1 计算后缀表达式 201 6.3.2 中缀表达式与后缀表达式的等价转换 202 6.4 使用栈查找航班图 205 6.5 栈和递归的关系 212 C++片段3 异常 221 C3.1 背景知识 222 C3.2 断言 223 C3.3 抛出异常 224 C3.4 处理异常 227 C3.4.1 多个catch块 228 C3.4.2 未捕获的异常 229 C3.5 程序员定义的异常类 232 第7章 实现ADT栈 235 7.1 基于数组的实现 236 7.2 基于链表的实现 239 7.3 在实现中使用异常 243 第8章 列表 247 8.1 指定ADT列表 248 8.2 使用列表操作 252 8.3 ADT列表的模板接口 255 第9章 实现列表 259 9.1 基于数组的ADT列表实现 260 9.1.1 头文件 261 9.1.2 实现文件 262 9.2 基于链表的ADT列表实现 266 9.2.1 头文件 266 9.2.2 实现文件 268 9.2.3 在LinkedList的方法中使用递归 275 9.3 两种实现的比较 279 第10章 算法的效率 283 10.1 什么是好的解决方案 284 10.2 测量算法的效率 285 10.2.1 算法的执行时间 286 10.2.2 算法增长率 287 10.2.3 分析与大O表示法 288 10.2.4 正确分析问题 291 10.2.5 查找算法的效率 293 第11章 排序算法及其效率 299 11.1 基本排序算法 300 11.1.1 选择排序 300 11.1.2 起泡排序 303 11.1.3 插入排序 305 11.2 较快排序算法 307 11.2.1 归并排序 307 11.2.2 快速排序 312 11.2.3 基数排序 319 11.3 各种排序算法的比较 321 C++片段4 类关系和重用 325 C4.1 回顾继承 326 C4.1.1 类的公有、私有和受保护部分 331 C4.1.2 公有、私有和受保护继承 332 C4.1.3 is-a和as-a关系 333 C4.2 包含:has-a关系 334 C4.3 回顾抽象基类 335 第12章 有序表及其实现 339 12.1 指定ADT有序表 340 12.1.1 ADT有序表的模板接口 342 12.1.2 使用有序表的操作 343 12.2 基于链表的实现 344 12.2.1 头文件 344 12.2.2 实现文件 345 12.2.3 基于链表的实现的效率 348 12.3 使用ADT列表的实现 348 12.3.1 包含 349 12.3.2 公有继承 352 12.3.3 私有继承 356 第13章 队列和优先队列 363 13.1 ADT队列 364 13.2 ADT队列的简单应用 367 13.2.1 读取字符串 367 13.2.2 识别回文 368 13.3 ADT优先队列 369 13.4 应用:模拟 371 13.5 面向位置和面向值的ADT 379 第14章 队列和优先队列的实现 387 14.1 ADT队列的实现 388 14.1.1 使用ADT列表的实现 388 14.1.2 基于链表的实现 390 14.1.3 基于数组的实现 394 14.1.4 比较实现 399 14.2 ADT优先队列的实现 400 C++片段5 运算符重载和友元访问 405 C5.1 重载运算符 406 C5.1.1 重载=进行赋值 408 C5.1.2 重载+进行连接 410 C5.2 友元访问和<<的重载 411 第15章 树 415 15.1 术语 416 15.1.1 树的类型 417 15.1.2 树的高度 419 15.1.3 满二叉树、完全二叉树和平衡二叉树 421 15.1.4 二叉树的最大和最小高度 422 15.2 ADT二叉树 425 15.2.1 二叉树的遍历 425 15.2.2 二叉树的操作 428 15.2.3 ADT二叉树的模板接口 430 15.3 ADT二叉查找树 432 15.3.1 二叉查找树的操作 433 15.3.2 查找二叉查找树 434 15.3.3 创建二叉查找树 435 15.3.4 遍历二叉查找树 437 15.3.5 二叉查找树操作的效率 437 第16章 树的实现 443 16.1 二叉树中的节点 444 16.1.1 基于数组的表示 444 16.1.2 基于链表的表示 446 16.2 ADT二叉树基于链表的实现 447 16.2.1 头文件 447 16.2.2 实现 450 16.3 ADT二叉查找树基于链表的实现 458 16.3.1 ADT二叉查找树操作的算法 458 16.3.2 BinarySearchTree类 469 16.4 在文件中保存二叉查找树 471 16.5 树排序 474 16.6 一般树 474 C++片段6 迭代器 479 C6.1 迭代器 480 C6.1.1 常见的迭代器操作 481 C6.1.2 使用迭代器操作 482 C6.1.3 实现迭代器 483 C6.2 迭代器的高级功能 485 第17章 堆 489 17.1 ADT堆 490 17.2 堆的基于数组的实现 493 17.2.1 基于数组的堆操作的算法 494 17.2.2 实现 498 17.3 ADT优先队列的堆实现 502 17.4 堆排序 504 第18章 字典及其实现 511 18.1 ADT字典 512 18.2 可能的实现 517 18.2.1 ADT字典的基于数组的有序实现 519 18.2.2 ADT字典的二叉查找树实现 521 18.3 选择实现 523 18.4 散列 529 18.4.1 散列函数 532 18.4.2 解决冲突 534 18.4.3 散列的效率 539 18.4.4 如何确立散列函数 542 18.4.5 字典遍历:散列的低效操作 543 18.4.6 使用散列和分离链实现ADT字典 544 第19章 平衡查找树 551 19.1 平衡查找树 552 19.2 2-3树 553 19.2.1 遍历2-3树 555 19.2.2 查找2-3树 556 19.2.3 在2-3树中插入数据 558 19.2.4 从2-3树中删除数据 562 19.3 2-3-4树 567 19.3.1 查找和遍历2-3-4树 569 19.3.2 在2-3-4树中插入数据 569 19.3.3 从2-3-4树中删除数据 572 19.4 红-黑树 573 19.4.1 查找和遍历红-黑树 575 19.4.2 红-黑树的插入和删除 575 19.5 AVL树 577 第20章 图 583 20.1 术语 584 20.2 将图作为ADT 587 20.3 图的遍历 591 20.3.1 深度优先查找 592 20.3.2 广度优先查找 593 20.4 图的应用 595 20.4.1 拓扑排序 595 20.4.2 生成树 598 20.4.3 最小生成树 600 20.4.4 最短路径 603 20.4.5 回路 606 20.4.6 一些复杂问题 608 第21章 外部存储中的数据处理 615 21.1 了解外部存储 616 21.2 排序外部文件的数据 618 21.3 外部字典 624 21.3.1 确定外部文件的索引 626 21.3.2 外部散列 629 21.3.3 B-树 632 21.3.4 遍历 639 21.3.5 多索引 640 C++片段7 标准模板库 647 C7.1 STL容器 648 C7.1.1 STL容器适配器 649 C7.1.2 顺序容器 650 C7.1.3 关联容器 654 C7.2 STL算法 657 附录A 回顾C++基础 659 附录B 编程中的重要主题 697 附录C 统一建模语言 719 附录D 软件生命周期 727 附录E 数学归纳法 733 附录F 算法验证 737 附录G C++文件基础 741 附录H C++头文件和标准函数 751 附录I C++文档系统 755 附录J ASCII字符代码 757 附录K 针对Java编程人员的C++知识 759 附录L 针对Python编程人员的C++知识 767
《Visual C++ 数据库系统开发完全手册》(目录) 第一篇 Visual C++编程篇 第1章 Visual C++ 6.0开发环境概述 1.1 Visual C++ 6.0概述 1.2 熟悉Visual C++ 6.0的集成开发环境 1.2.1 进入Visual C++ 6.0环境 1.2.2 Visual C++ 6.0的主菜单 1.2.3 Visual C++ 6.0的工具栏 1.2.4 工作区(Workspace)窗口 1.2.5 编辑窗口 1.2.6 输出(Output)窗口 第2章 C++语言基础 2.1 C++概述 2.1.1 C++主要特点 2.1.2 利用Visual C++编制C++程序 2.2 C++程序的组成 2.2.1 标识符 2.2.2 关键字 2.2.3 常量与变量 2.2.4 基本运算符 2.3 C++数据类型 2.3.1 基本数据类型 2.3.2 数组 2.3.3 指针 2.3.4 结构 2.3.5 枚举类型 2.4 控制结构 2.4.1 顺序结构 2.4.2 分支结构 2.4.3 循环结构 2.4.4 转移语句 2.5 函数 2.5.1 函数的定义与调用 2.5.2 默认参数 2.5.3 函数重载概述 2.6 编译预处理指令 2.6.1 #include文件包含指令 2.6.2 #define宏定义指令 2.6.3 条件编译指令 第3章 面向对象的程序设计 3.1 概述 3.1.1 面向对象程序设计方法 3.1.2 面向对象程序设计特征 3.2 C++面向对象程序设计基础 3.2.1 C++类的定义与实现 3.2.2 构造函数与析构函数 3.2.3 静态成员 3.2.4 this指针 3.2.5 友元函数 3.3 类的继承机制 3.3.1 基类与派生类概念 3.3.2 单一派生 3.3.3 多重继承 3.3.4 虚基类 3.4 多态性与虚函数 3.5 抽象类与纯虚函数 3.6 C++模板 3.6.1 函数模板 3.6.2 类模板 第4章 创建应用程序 4.1 应用程序向导 4.1.1 Visual C++ 6.0中的向导类型 4.1.2 Visual C++ 6.0中的应用程序向导 4.1.3 MFC应用程序的开发流程 4.2 应用程序向导生成文件 4.2.1 文件类型 4.2.2 典型文件举例 4.3 ClassWizard(类向导) 4.3.1 ClassWizard的功能 4.3.2 ClassWizard的简单应用 4.3.3 为项目添加新类 4.3.4 手工添加消息处理函数 第5章 文档与视图 5.1 Document与View概述 5.2 Document与View之间的相互作用 5.2.1 CView类的GetDocument()成员函数 5.2.2 CDocument类的UpdateAllViews()成员函数 5.2.3 CView类的OnUpdate()成员函数 5.3 菜单设计 5.3.1 建立菜单资源 5.3.2 添加菜单命令处理函数 5.3.3 弹出式菜单 5.4 工具栏和状态栏设计 5.4.1 建立工具栏资源 5.4.2 工具栏的显示 5.4.3 定制状态栏 5.5 使用不同的视图 5.5.1 滚动视图 5.5.2 网页视图 5.5.3 多文档视图 第6章 MFC原理及方法 6.1 MFC概述 6.2 Windows编程思想 6.2.1 Windows API 6.2.2 事件驱动程序 6.2.3 消息概述 6.3 MFC微软类库 6.3.1 MFC发展历史 6.3.2 MFC应用程序的生与死 6.3.3 常用MFC文件及库文件 6.4 常用的MFC类 6.4.1 CRuntimeClass结构 6.4.2 CObject类 6.4.3 CCmdTarget类 6.4.4 CWinThread类 6.4.5 CWinApp类 6.4.6 CWnd类 6.4.7 CFrameWnd类 6.4.8 CDocument和CView类 6.5 MFC消息机制 6.5.1 系统定义的消息 6.5.2 用户定义的消息 6.5.3 消息映射 6.5.4 消息的发送 6.6 MFC宏 6.6.1 运行时类型识别宏 6.6.2 MFC调试宏 第7章 对话框及常用控件 7.1 对话框概述 7.1.1 基于对话框的应用程序 7.1.2 对话框类CDialog 7.2 向对话框类中添加菜单 7.3 向对话框类中添加工具栏 7.4 向对话框中添加状态栏 7.5 Windows公共对话框 7.5.1 CColorDialog对话框 7.5.2 CFileDialog对话框 7.5.3 CFontDialog对话框 7.6 常用控件 7.6.1 控件概述 7.6.2 使用控件 7.6.3 通用控件类成员 7.6.4 静态文本控件(Static Text) 7.6.5 按钮控件(Button) 7.6.6 编辑控件(Edit Box) 7.6.7 列表框控件(List Box) 7.6.8 组合框控件(Combo Box) 7.6.9 树视图控件(Tree Control) 7.6.10 列表视图控件(List Control) 7.6.11 标签控件(Tab Control) 7.7 ActiveX控件 7.8 制作ActiveX控件 7.8.1 制作ActiveX控件的方法 7.8.2 ActiveX控件创建实例 第8章 图形图像及打印技术 8.1 图形设备接口概述 8.2 设备环境类CDC 8.2.1 设备环境简介 8.2.2 设备环境类CDC 8.2.3 设置场景类CDC的简单应用 8.3 画笔类CPen 8.4 画刷类CBrush 8.5 字体类CFont 8.6 位图类CBitmap 8.7 打印基础 8.8 如何打印表格 8.8.1 打印流程 8.8.2 怎样打印表格 第9章 程序调试与错误处理 9.1 概述 9.2 断点跟踪 9.3 调试窗口 9.3.1 Watch窗口 9.3.2 Call Stack窗口 9.3.3 Memory窗口 9.3.4 Variables窗口 9.3.5 Registers窗口 9.3.6 Disassembly窗口 9.4 错误处理 9.4.1 捕捉错误 9.4.2 C++中的错误处理 9.4.3 编制错误处理程序 第二篇 数据库应用篇 第10章 管理SQL Server 2000 10.1 安装SQL Server 10.2 配置服务器 10.2.1 启动、暂停和停止SQL Server服务器 10.2.2 注册SQL Server 2000服务器 10.2.3 编辑SQL Server 2000注册信息 10.3 脚本概述 10.3.1 将数据库生成脚本 10.3.2 将指定表生成脚本 10.3.3 执行脚本 10.4 备份和还原数据库 10.4.1 备份和还原的概念 10.4.2 数据库备份 10.4.3 数据库还原 10.5 分离和附加数据库 10.5.1 分离数据库 10.5.2 附加数据库 10.6 导入、导出数据表 10.6.1 导入数据库 10.6.2 导入SQL Server数据表 10.6.3 导入其他数据源的数据表 10.6.4 导出数据库 10.6.5 导出SQL Server数据表 第11章 SQL Server 2000数据库设计与操作 11.1 关系数据库 11.1.1 数据库及关系数据库概述 11.1.2 数据库发展历史 11.1.3 关系型数据库 11.2 分析数据库 11.2.1 分析数据库结构 11.2.2 设计数据库 11.3 使用数据库 11.3.1 创建数据库 11.3.2 创建数据表 11.3.3 SQL Server中的数据类型 11.3.4 向数据表中添加数据 11.4 建立索引 11.4.1 建立和删除惟一索引 11.4.2 定义主键索引 11.5 关系的建立与维护 11.5.1 建立一对一关系 11.5.2 建立一对多关系 11.5.3 删除关系 11.6 使用Visual C++ 6.0与数据库连接 11.6.1 ADO简介 11.6.2 使用ADO连接数据源前的准备工作 11.6.3 Connection与Recordset 11.6.4 打开数据与关闭数据连接 11.7 如何使用ADO 11.7.1 如何打开记录集 11.7.2 怎样使用记录集 11.8 重新封装ADO 11.8.1 RxADO类的制作方法 11.8.2 RxRecordset类的制作方法 第12章 数据查询技巧 12.1 SQL简介 12.2 查询命令SELECT 12.2.1 SELECT命令简介 12.2.2 SELECT子句 12.2.3 FROM子句 12.2.4 WHERE子句 12.2.5 使用ORDER BY排序查询结果 12.2.6 聚合函数 12.2.7 GROUP BY子句 12.2.8 HAVING子句 12.2.9 复杂查询 12.3 插入命令INSERT 12.3.1 INSERT命令简介 12.3.2 简单的INSERT命令 12.3.3 在插入命令中使用SELECT 12.4 更新命令UPDATE 12.4.1 UPDATE命令简介 12.4.2 简单的UPDATE命令 12.4.3 在UPDATE更新命令中使用子查询 12.5 删除命令DELETE 12.5.1 DELETE命令简介 12.5.2 简单的DELETE命令 12.5.3 在删除中使用子查询 12.6 数据备份与数据还原 12.6.1 数据备份命令BACKUP 12.6.2 数据还原命令RESTORE 第13章 存储过程、触发器与视图 13.1 存储过程概述 13.2 存储过程的应用 13.2.1 新建存储过程 13.2.2 修改存储过程 13.2.3 删除存储过程 13.2.4 获取数据库中存储过程 13.2.5 获取指定存储过程语句 13.2.6 存储过程的调用 13.3 触发器介绍 13.4 使用触发器 13.4.1 新建触发器 13.4.2 修改触发器 13.4.3 删除触发器 13.5 视图介绍 13.6 视图应用 13.6.1 新建视图 13.6.2 修改视图 13.6.3 删除视图 13.6.4 获得数据库中所有的视图 13.6.5 获得指定视图语句 第三篇 实例开发篇 第14章 定制自己的工作环境 14.1 工具环境设置介绍 14.1.1 Editor 14.1.2 Tabs 14.1.3 Debug 14.1.4 Compatibility 14.1.5 Build 14.1.6 Directories 14.1.7 Source Control 14.1.8 Workspace 14.1.9 Macros 14.1.10 Format 14.2 定制自己的工作环境 14.3 常用快捷键 第15章 Visual C++ 6.0在资产设备管理系统中的应用 15.1 资产设备管理系统概述 15.1.1 开发背景及意义 15.1.2 系统目标 15.2 系统分析 15.2.1 系统规划 15.2.2 系统结构图 15.2.3 业务流程 15.3 数据库设计 15.3.1 数据库概念设计 15.3.2 数据库逻辑结构设计 15.4 处理过程分析 15.4.1 添加资产设备处理过程分析 15.4.2 计提折旧处理过程分析 15.5 程序框架设计 15.6 封装数据库操作 15.6.1 导入ADO动态链接库 15.6.2 封装ADO对象 15.7 菜单设计 15.8 设计状态栏 15.9 设计工具栏 15.10 主窗体设计 15.11 程序设计与编码 15.11.1 资产类别程序设计 15.11.2 添加资产设备程序设计 15.11.3 修改资产设备程序设计 15.11.4 计提折旧程序设计 15.11.5 数据备份程序设计 15.11.6 数据还原程序设计 15.12 疑难问题分析解决 15.12.1 只允许输入数字的编辑框 15.12.2 更改静态文本的字体 15.12.3 为按钮控件添加图标 15.12.4 修改窗口图标 15.12.5 遍历窗口中的控件 15.12.6 固定资产基本概念 15.12.7 固定资产计算公式 15.13 程序调试及错误处理 15.14 程序设计清单 15.15 技术、经验总结 15.15.1 技术总结 15.15.2 经验总结 15.16 系统的编译与发行 第16章 Visual C++ 6.0在物资管理系统中的应用 16.1 物资管理系统概述 16.1.1 系统简介 16.1.2 实现目标 16.2 系统分析 16.2.1 系统规划 16.2.2 系统结构图 16.2.3 业务流程 16.3 数据库设计 16.3.1 数据库概念设计 16.3.2 数据库逻辑结构设计 16.4 程序设计与编码 16.4.1 基础信息查询类设计 16.4.2 商品信息管理模块 16.4.3 日常业务类设计 16.4.4 出库统计排行模块 16.5 对话框资源对照说明 16.6 程序的打包与发行 16.6.1 组织安装信息 16.6.2 设置目标系统 16.6.3 设置安装画面 16.6.4 设置系统需求 16.6.5 安装打包程序 第17章 Visual C++ 6.0在商品采购管理系统中的应用 17.1 商品采购管理系统概述 17.1.1 开发背景 17.1.2 运行环境 17.2 系统调查 17.2.1 手工流程 17.2.2 需求分析 17.3 系统分析 17.3.1 系统功能 17.3.2 系统结构图 17.3.3 业务流程 17.4 数据库设计 17.4.1 数据库概念设计 17.4.2 数据库逻辑结构设计 17.5 数据库封装类说明 17.5.1 概述 17.5.2 设计步骤 17.5.3 程序相关代码 17.6 主窗体设计 17.6.1 菜单设计 17.6.2 设计背景画面 17.6.3 程序设计与编码 17.7 采购管理设计 17.7.1 概述 17.7.2 设计步骤 17.7.3 程序相关代码 17.8 疑难问题分析解决 17.8.1 怎样取得当前日期 17.8.2 怎样取得当前路径 17.9 程序调试及错误处理 17.10 技术、经验总结 17.10.1 技术总结 17.10.2 经验总结 第18章 Visual C++ 6.0在仓库管理系统中的应用 18.1 仓库管理系统概述 18.1.1 开发背景及意义 18.1.2 系统目标 18.2 系统分析 18.2.1 系统规划 18.2.2 系统结构图 18.2.3 业务流程 18.3 数据库设计 18.3.1 数据库概念设计 18.3.2 数据库逻辑结构设计 18.4 处理过程分析 18.4.1 商品入库处理过程分析 18.4.2 商品入库查询处理过程分析 18.5 程序框架设计 18.6 菜单设计 18.7 工具栏设计 18.8 主窗体设计 18.9 程序设计与编码 18.9.1 父窗口设计 18.9.2 商品入库程序设计 18.9.3 库存盘点程序设计 18.9.4 入库查询程序设计 18.10 疑难问题分析解决 18.10.1 利用表格录入商品 18.10.2 联想录入表格的实现 18.11 程序调试及错误处理 18.12 程序设计清单 18.13 技术、经验总结 18.13.1 技术总结 18.13.2 经验总结 18.14 系统的编译与发行 第19章 Visual C++ 6.0在销售管理系统中的应用 19.1 销售管理系统概述 19.1.1 开发背景及意义 19.1.2 系统目标 19.2 系统分析 19.2.1 系统规划 19.2.2 系统结构图 19.2.3 业务流程 19.3 数据库设计 19.3.1 数据库概念设计 19.3.2 数据库逻辑结构设计 19.4 处理过程分析 19.4.1 商品入库处理过程分析 19.4.2 商品销售处理过程分析 19.5 数据库封装类说明 19.5.1 概述 19.5.2 设计步骤 19.5.3 程序相关代码 19.6 主窗体设计 19.6.1 菜单设计 19.6.2 设计背景画面 19.6.3 程序相关代码 19.7 操作员管理程序设计 19.7.1 概述 19.7.2 设计步骤 19.7.3 程序相关代码 19.8 销售管理设计 19.8.1 概述 19.8.2 设计步骤 19.8.3 程序相关代码 19.9 疑难问题分析解决 19.9.1 不显示文字的密码编辑框 19.9.2 数据库参数 19.10 程序调试及错误处理 19.11 程序设计清单 19.12 技术、经验总结 19.12.1 技术总结 19.12.2 经验总结 19.13 系统的编译与发行 第20章 Visual C++ 6.0在图书管理系统中的应用 20.1 图书管理系统概述 20.1.1 开发背景及意义 20.1.2 系统目标 20.2 系统分析 20.2.1 系统规划 20.2.2 系统结构图 20.2.3 业务流程 20.3 数据库设计 20.3.1 数据库概念设计 20.3.2 数据库逻辑结构设计 20.4 处理过程分析 20.4.1 图书信息处理过程分析 20.4.2 销售查询处理过程分析 20.5 程序框架设计 20.6 主窗体设计 20.7 程序设计与编码 20.7.1 系统登录程序设计 20.7.2 操作员管理程序设计 20.7.3 图书信息管理程序设计 20.7.4 图书销售查询程序设计 20.8 疑难问题分析解决 20.8.1 在对话框中添加文档/视图架构 20.8.2 在基于对话框程序中实现打印及打印预览 20.9 异常处理 20.10 程序设计清单 20.11 技术、经验总结 20.11.1 技术总结 20.11.2 经验总结 20.12 系统的编译与发行 第21章 Visual C++ 6.0在学生管理系统中的应用 21.1 学生管理系统概述 21.1.1 开发背景及意义 21.1.2 系统目标 21.2 系统分析 21.2.1 系统规划 21.2.2 系统结构图 21.2.3 业务流程 21.3 数据库设计 21.3.1 数据库概念设计 21.3.2 数据库逻辑结构设计 21.4 处理过程分析 21.4.1 科室信息添加处理过程分析 21.4.2 学生违规登记处理过程分析 21.5 主窗体设计 21.6 程序设计与编码 21.6.1 科室信息管理程序设计 21.6.2 学生成绩录入程序设计 21.6.3 学生违规处理程序设计 21.6.4 学生成绩报表程序设计 21.7 疑难问题分析解决 21.7.1 导入Excel相关类 21.7.2 在程序中操作Excel 21.7.3 导入Word相关类 21.7.4 在程序中操作Word 21.8 系统测试 21.9 程序设计清单 21.10 技术、经验总结 21.10.1 技术总结 21.10.2 经验总结 21.11 系统的编译与发行
《Visual C++ 数据库系统开发完全手册》(目录) 第一篇 Visual C++编程篇 第1章 Visual C++ 6.0开发环境概述 1.1 Visual C++ 6.0概述 1.2 熟悉Visual C++ 6.0的集成开发环境 1.2.1 进入Visual C++ 6.0环境 1.2.2 Visual C++ 6.0的主菜单 1.2.3 Visual C++ 6.0的工具栏 1.2.4 工作区(Workspace)窗口 1.2.5 编辑窗口 1.2.6 输出(Output)窗口 第2章 C++语言基础 2.1 C++概述 2.1.1 C++主要特点 2.1.2 利用Visual C++编制C++程序 2.2 C++程序的组成 2.2.1 标识符 2.2.2 关键字 2.2.3 常量与变量 2.2.4 基本运算符 2.3 C++数据类型 2.3.1 基本数据类型 2.3.2 数组 2.3.3 指针 2.3.4 结构 2.3.5 枚举类型 2.4 控制结构 2.4.1 顺序结构 2.4.2 分支结构 2.4.3 循环结构 2.4.4 转移语句 2.5 函数 2.5.1 函数的定义与调用 2.5.2 默认参数 2.5.3 函数重载概述 2.6 编译预处理指令 2.6.1 #include文件包含指令 2.6.2 #define宏定义指令 2.6.3 条件编译指令 第3章 面向对象的程序设计 3.1 概述 3.1.1 面向对象程序设计方法 3.1.2 面向对象程序设计特征 3.2 C++面向对象程序设计基础 3.2.1 C++类的定义与实现 3.2.2 构造函数与析构函数 3.2.3 静态成员 3.2.4 this指针 3.2.5 友元函数 3.3 类的继承机制 3.3.1 基类与派生类概念 3.3.2 单一派生 3.3.3 多重继承 3.3.4 虚基类 3.4 多态性与虚函数 3.5 抽象类与纯虚函数 3.6 C++模板 3.6.1 函数模板 3.6.2 类模板 第4章 创建应用程序 4.1 应用程序向导 4.1.1 Visual C++ 6.0中的向导类型 4.1.2 Visual C++ 6.0中的应用程序向导 4.1.3 MFC应用程序的开发流程 4.2 应用程序向导生成文件 4.2.1 文件类型 4.2.2 典型文件举例 4.3 ClassWizard(类向导) 4.3.1 ClassWizard的功能 4.3.2 ClassWizard的简单应用 4.3.3 为项目添加新类 4.3.4 手工添加消息处理函数 第5章 文档与视图 5.1 Document与View概述 5.2 Document与View之间的相互作用 5.2.1 CView类的GetDocument()成员函数 5.2.2 CDocument类的UpdateAllViews()成员函数 5.2.3 CView类的OnUpdate()成员函数 5.3 菜单设计 5.3.1 建立菜单资源 5.3.2 添加菜单命令处理函数 5.3.3 弹出式菜单 5.4 工具栏和状态栏设计 5.4.1 建立工具栏资源 5.4.2 工具栏的显示 5.4.3 定制状态栏 5.5 使用不同的视图 5.5.1 滚动视图 5.5.2 网页视图 5.5.3 多文档视图 第6章 MFC原理及方法 6.1 MFC概述 6.2 Windows编程思想 6.2.1 Windows API 6.2.2 事件驱动程序 6.2.3 消息概述 6.3 MFC微软类库 6.3.1 MFC发展历史 6.3.2 MFC应用程序的生与死 6.3.3 常用MFC文件及库文件 6.4 常用的MFC类 6.4.1 CRuntimeClass结构 6.4.2 CObject类 6.4.3 CCmdTarget类 6.4.4 CWinThread类 6.4.5 CWinApp类 6.4.6 CWnd类 6.4.7 CFrameWnd类 6.4.8 CDocument和CView类 6.5 MFC消息机制 6.5.1 系统定义的消息 6.5.2 用户定义的消息 6.5.3 消息映射 6.5.4 消息的发送 6.6 MFC宏 6.6.1 运行时类型识别宏 6.6.2 MFC调试宏 第7章 对话框及常用控件 7.1 对话框概述 7.1.1 基于对话框的应用程序 7.1.2 对话框类CDialog 7.2 向对话框类中添加菜单 7.3 向对话框类中添加工具栏 7.4 向对话框中添加状态栏 7.5 Windows公共对话框 7.5.1 CColorDialog对话框 7.5.2 CFileDialog对话框 7.5.3 CFontDialog对话框 7.6 常用控件 7.6.1 控件概述 7.6.2 使用控件 7.6.3 通用控件类成员 7.6.4 静态文本控件(Static Text) 7.6.5 按钮控件(Button) 7.6.6 编辑控件(Edit Box) 7.6.7 列表框控件(List Box) 7.6.8 组合框控件(Combo Box) 7.6.9 树视图控件(Tree Control) 7.6.10 列表视图控件(List Control) 7.6.11 标签控件(Tab Control) 7.7 ActiveX控件 7.8 制作ActiveX控件 7.8.1 制作ActiveX控件的方法 7.8.2 ActiveX控件创建实例 第8章 图形图像及打印技术 8.1 图形设备接口概述 8.2 设备环境类CDC 8.2.1 设备环境简介 8.2.2 设备环境类CDC 8.2.3 设置场景类CDC的简单应用 8.3 画笔类CPen 8.4 画刷类CBrush 8.5 字体类CFont 8.6 位图类CBitmap 8.7 打印基础 8.8 如何打印表格 8.8.1 打印流程 8.8.2 怎样打印表格 第9章 程序调试与错误处理 9.1 概述 9.2 断点跟踪 9.3 调试窗口 9.3.1 Watch窗口 9.3.2 Call Stack窗口 9.3.3 Memory窗口 9.3.4 Variables窗口 9.3.5 Registers窗口 9.3.6 Disassembly窗口 9.4 错误处理 9.4.1 捕捉错误 9.4.2 C++中的错误处理 9.4.3 编制错误处理程序 第二篇 数据库应用篇 第10章 管理SQL Server 2000 10.1 安装SQL Server 10.2 配置服务器 10.2.1 启动、暂停和停止SQL Server服务器 10.2.2 注册SQL Server 2000服务器 10.2.3 编辑SQL Server 2000注册信息 10.3 脚本概述 10.3.1 将数据库生成脚本 10.3.2 将指定表生成脚本 10.3.3 执行脚本 10.4 备份和还原数据库 10.4.1 备份和还原的概念 10.4.2 数据库备份 10.4.3 数据库还原 10.5 分离和附加数据库 10.5.1 分离数据库 10.5.2 附加数据库 10.6 导入、导出数据表 10.6.1 导入数据库 10.6.2 导入SQL Server数据表 10.6.3 导入其他数据源的数据表 10.6.4 导出数据库 10.6.5 导出SQL Server数据表 第11章 SQL Server 2000数据库设计与操作 11.1 关系数据库 11.1.1 数据库及关系数据库概述 11.1.2 数据库发展历史 11.1.3 关系型数据库 11.2 分析数据库 11.2.1 分析数据库结构 11.2.2 设计数据库 11.3 使用数据库 11.3.1 创建数据库 11.3.2 创建数据表 11.3.3 SQL Server中的数据类型 11.3.4 向数据表中添加数据 11.4 建立索引 11.4.1 建立和删除惟一索引 11.4.2 定义主键索引 11.5 关系的建立与维护 11.5.1 建立一对一关系 11.5.2 建立一对多关系 11.5.3 删除关系 11.6 使用Visual C++ 6.0与数据库连接 11.6.1 ADO简介 11.6.2 使用ADO连接数据源前的准备工作 11.6.3 Connection与Recordset 11.6.4 打开数据与关闭数据连接 11.7 如何使用ADO 11.7.1 如何打开记录集 11.7.2 怎样使用记录集 11.8 重新封装ADO 11.8.1 RxADO类的制作方法 11.8.2 RxRecordset类的制作方法 第12章 数据查询技巧 12.1 SQL简介 12.2 查询命令SELECT 12.2.1 SELECT命令简介 12.2.2 SELECT子句 12.2.3 FROM子句 12.2.4 WHERE子句 12.2.5 使用ORDER BY排序查询结果 12.2.6 聚合函数 12.2.7 GROUP BY子句 12.2.8 HAVING子句 12.2.9 复杂查询 12.3 插入命令INSERT 12.3.1 INSERT命令简介 12.3.2 简单的INSERT命令 12.3.3 在插入命令中使用SELECT 12.4 更新命令UPDATE 12.4.1 UPDATE命令简介 12.4.2 简单的UPDATE命令 12.4.3 在UPDATE更新命令中使用子查询 12.5 删除命令DELETE 12.5.1 DELETE命令简介 12.5.2 简单的DELETE命令 12.5.3 在删除中使用子查询 12.6 数据备份与数据还原 12.6.1 数据备份命令BACKUP 12.6.2 数据还原命令RESTORE 第13章 存储过程、触发器与视图 13.1 存储过程概述 13.2 存储过程的应用 13.2.1 新建存储过程 13.2.2 修改存储过程 13.2.3 删除存储过程 13.2.4 获取数据库中存储过程 13.2.5 获取指定存储过程语句 13.2.6 存储过程的调用 13.3 触发器介绍 13.4 使用触发器 13.4.1 新建触发器 13.4.2 修改触发器 13.4.3 删除触发器 13.5 视图介绍 13.6 视图应用 13.6.1 新建视图 13.6.2 修改视图 13.6.3 删除视图 13.6.4 获得数据库中所有的视图 13.6.5 获得指定视图语句 第三篇 实例开发篇 第14章 定制自己的工作环境 14.1 工具环境设置介绍 14.1.1 Editor 14.1.2 Tabs 14.1.3 Debug 14.1.4 Compatibility 14.1.5 Build 14.1.6 Directories 14.1.7 Source Control 14.1.8 Workspace 14.1.9 Macros 14.1.10 Format 14.2 定制自己的工作环境 14.3 常用快捷键 第15章 Visual C++ 6.0在资产设备管理系统中的应用 15.1 资产设备管理系统概述 15.1.1 开发背景及意义 15.1.2 系统目标 15.2 系统分析 15.2.1 系统规划 15.2.2 系统结构图 15.2.3 业务流程 15.3 数据库设计 15.3.1 数据库概念设计 15.3.2 数据库逻辑结构设计 15.4 处理过程分析 15.4.1 添加资产设备处理过程分析 15.4.2 计提折旧处理过程分析 15.5 程序框架设计 15.6 封装数据库操作 15.6.1 导入ADO动态链接库 15.6.2 封装ADO对象 15.7 菜单设计 15.8 设计状态栏 15.9 设计工具栏 15.10 主窗体设计 15.11 程序设计与编码 15.11.1 资产类别程序设计 15.11.2 添加资产设备程序设计 15.11.3 修改资产设备程序设计 15.11.4 计提折旧程序设计 15.11.5 数据备份程序设计 15.11.6 数据还原程序设计 15.12 疑难问题分析解决 15.12.1 只允许输入数字的编辑框 15.12.2 更改静态文本的字体 15.12.3 为按钮控件添加图标 15.12.4 修改窗口图标 15.12.5 遍历窗口中的控件 15.12.6 固定资产基本概念 15.12.7 固定资产计算公式 15.13 程序调试及错误处理 15.14 程序设计清单 15.15 技术、经验总结 15.15.1 技术总结 15.15.2 经验总结 15.16 系统的编译与发行 第16章 Visual C++ 6.0在物资管理系统中的应用 16.1 物资管理系统概述 16.1.1 系统简介 16.1.2 实现目标 16.2 系统分析 16.2.1 系统规划 16.2.2 系统结构图 16.2.3 业务流程 16.3 数据库设计 16.3.1 数据库概念设计 16.3.2 数据库逻辑结构设计 16.4 程序设计与编码 16.4.1 基础信息查询类设计 16.4.2 商品信息管理模块 16.4.3 日常业务类设计 16.4.4 出库统计排行模块 16.5 对话框资源对照说明 16.6 程序的打包与发行 16.6.1 组织安装信息 16.6.2 设置目标系统 16.6.3 设置安装画面 16.6.4 设置系统需求 16.6.5 安装打包程序 第17章 Visual C++ 6.0在商品采购管理系统中的应用 17.1 商品采购管理系统概述 17.1.1 开发背景 17.1.2 运行环境 17.2 系统调查 17.2.1 手工流程 17.2.2 需求分析 17.3 系统分析 17.3.1 系统功能 17.3.2 系统结构图 17.3.3 业务流程 17.4 数据库设计 17.4.1 数据库概念设计 17.4.2 数据库逻辑结构设计 17.5 数据库封装类说明 17.5.1 概述 17.5.2 设计步骤 17.5.3 程序相关代码 17.6 主窗体设计 17.6.1 菜单设计 17.6.2 设计背景画面 17.6.3 程序设计与编码 17.7 采购管理设计 17.7.1 概述 17.7.2 设计步骤 17.7.3 程序相关代码 17.8 疑难问题分析解决 17.8.1 怎样取得当前日期 17.8.2 怎样取得当前路径 17.9 程序调试及错误处理 17.10 技术、经验总结 17.10.1 技术总结 17.10.2 经验总结 第18章 Visual C++ 6.0在仓库管理系统中的应用 18.1 仓库管理系统概述 18.1.1 开发背景及意义 18.1.2 系统目标 18.2 系统分析 18.2.1 系统规划 18.2.2 系统结构图 18.2.3 业务流程 18.3 数据库设计 18.3.1 数据库概念设计 18.3.2 数据库逻辑结构设计 18.4 处理过程分析 18.4.1 商品入库处理过程分析 18.4.2 商品入库查询处理过程分析 18.5 程序框架设计 18.6 菜单设计 18.7 工具栏设计 18.8 主窗体设计 18.9 程序设计与编码 18.9.1 父窗口设计 18.9.2 商品入库程序设计 18.9.3 库存盘点程序设计 18.9.4 入库查询程序设计 18.10 疑难问题分析解决 18.10.1 利用表格录入商品 18.10.2 联想录入表格的实现 18.11 程序调试及错误处理 18.12 程序设计清单 18.13 技术、经验总结 18.13.1 技术总结 18.13.2 经验总结 18.14 系统的编译与发行 第19章 Visual C++ 6.0在销售管理系统中的应用 19.1 销售管理系统概述 19.1.1 开发背景及意义 19.1.2 系统目标 19.2 系统分析 19.2.1 系统规划 19.2.2 系统结构图 19.2.3 业务流程 19.3 数据库设计 19.3.1 数据库概念设计 19.3.2 数据库逻辑结构设计 19.4 处理过程分析 19.4.1 商品入库处理过程分析 19.4.2 商品销售处理过程分析 19.5 数据库封装类说明 19.5.1 概述 19.5.2 设计步骤 19.5.3 程序相关代码 19.6 主窗体设计 19.6.1 菜单设计 19.6.2 设计背景画面 19.6.3 程序相关代码 19.7 操作员管理程序设计 19.7.1 概述 19.7.2 设计步骤 19.7.3 程序相关代码 19.8 销售管理设计 19.8.1 概述 19.8.2 设计步骤 19.8.3 程序相关代码 19.9 疑难问题分析解决 19.9.1 不显示文字的密码编辑框 19.9.2 数据库参数 19.10 程序调试及错误处理 19.11 程序设计清单 19.12 技术、经验总结 19.12.1 技术总结 19.12.2 经验总结 19.13 系统的编译与发行 第20章 Visual C++ 6.0在图书管理系统中的应用 20.1 图书管理系统概述 20.1.1 开发背景及意义 20.1.2 系统目标 20.2 系统分析 20.2.1 系统规划 20.2.2 系统结构图 20.2.3 业务流程 20.3 数据库设计 20.3.1 数据库概念设计 20.3.2 数据库逻辑结构设计 20.4 处理过程分析 20.4.1 图书信息处理过程分析 20.4.2 销售查询处理过程分析 20.5 程序框架设计 20.6 主窗体设计 20.7 程序设计与编码 20.7.1 系统登录程序设计 20.7.2 操作员管理程序设计 20.7.3 图书信息管理程序设计 20.7.4 图书销售查询程序设计 20.8 疑难问题分析解决 20.8.1 在对话框中添加文档/视图架构 20.8.2 在基于对话框程序中实现打印及打印预览 20.9 异常处理 20.10 程序设计清单 20.11 技术、经验总结 20.11.1 技术总结 20.11.2 经验总结 20.12 系统的编译与发行 第21章 Visual C++ 6.0在学生管理系统中的应用 21.1 学生管理系统概述 21.1.1 开发背景及意义 21.1.2 系统目标 21.2 系统分析 21.2.1 系统规划 21.2.2 系统结构图 21.2.3 业务流程 21.3 数据库设计 21.3.1 数据库概念设计 21.3.2 数据库逻辑结构设计 21.4 处理过程分析 21.4.1 科室信息添加处理过程分析 21.4.2 学生违规登记处理过程分析 21.5 主窗体设计 21.6 程序设计与编码 21.6.1 科室信息管理程序设计 21.6.2 学生成绩录入程序设计 21.6.3 学生违规处理程序设计 21.6.4 学生成绩报表程序设计 21.7 疑难问题分析解决 21.7.1 导入Excel相关类 21.7.2 在程序中操作Excel 21.7.3 导入Word相关类 21.7.4 在程序中操作Word 21.8 系统测试 21.9 程序设计清单 21.10 技术、经验总结 21.10.1 技术总结 21.10.2 经验总结 21.11 系统的编译与发行

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值