注册 | 登录读书好,好读书,读好书!
读书网-DuShu.com
当前位置: 首页出版图书科学技术计算机/网络软件与程序设计C/C++及其相关C++大学教程(第3版 国外计算机科学经典教材)

C++大学教程(第3版 国外计算机科学经典教材)

C++大学教程(第3版 国外计算机科学经典教材)

定 价:¥49.80

作 者: (美)Eric Nagler著;侯普秀,曹振新译
出版社: 清华大学出版社
丛编项: 国外计算机科学经典教材
标 签: 暂缺

ISBN: 9787302098492 出版时间: 2005-03-01 包装: 简裝本
开本: 26cm 页数: 432 字数:  

内容简介

  内容简介目录 本书内容详尽,示例丰富,通过400多个简短易懂的示例深入介绍了C++程序设计方法。全书共分18章,前5章讲解了C++编程和C语言过程化编程之间的区别,内容包括从C到C++的迁移、命名空间、输入输出基础、引用变量和动态内存分配;后面各章介绍了一些常用类及其用、构造函数和析构函数、异常处理、函数重载、继承、模板、输入/输出流、操丛符、string类及标准模板库等内容;本书最后的附录A列出了相关的参考书目,附录B则提供了使用C++的一些准则。本书结构特色实用性和可操作性强。提供了大量的编程示例,帮助学生透彻理解所学的概念。通过大量的练习题进一步巩固所学的内容,确保学生能够真正掌握各章节的内容。科简短明了的"小结"部分总结了各章节的主题内容,使学生对所学的内容一个整体的认识。"注意"部分重点说明了与章节中所介绍概念相关的重要内容。 第1章 由C迁移到C++1.1 概述1.2 C与C++的比较1.3编译器如何识别C++程序1.4预处理器如何识别环境1.5新的注释风格1.6永远不要假定(隐式地使用int类型)1.7 main()的默认返回值1.8声明与定义的区别1.9函数声明中的形参名称1.1 O 函数定义中的形参名称1.1l 所有的函数在调用前必须先声明l-1 2空圆括号的含义1.13函数参数的默认值1.14初始化与赋值的区别1.15放置变量声明的地方1.16 for循环内的变量声明1.17标记名成为类型名1.18 C++与C中枚举类型的区别1.1 9初始化全局变量1.20数组初始化1.2 1 布尔类型1.22 void木指针1.23 使用O,而不是宏NULL1.24 关键字const1.24.1 所有的常量必须初始化1.24.2将常量值的参数传递给函数的含义1.24.3 函数返回值为常量的含义1.24.4 const如何影响指针1.24.5 C++与C中字符数组的区别1.24.6如何支持char const*类型的数组1.24.7 C以及C++处理const方式的区别1.24.8使用const而不是#define1.24 变量的连接1.25新的类型强制转换风格1.25.1 类型强制转换以及转换的区别1.25.2类型强制转换的一般格式1.25.3 static cast1.25.4 reinterpret cast1.25.5 const-cast1.25.6您不会犯错1.26 C以及C++关键字第2章命名空间2.1 概述2.2存在的问题2.3 如何创建命名空间2.4作用域分解运算符2.5 如何访问命名空问的成员2.5.1 直接访问命名空间的成员2.5.2 using声明:访问命名空间成员的另一种方法2.5.3 using指令:访问命名空间成员的另一种方法2.6 小心避免不明确的情况2.7无名的命名空间2.8命名空间的别名2.9 Koenig查找规则第3章输入/输出基础3.1 概述3.2使用新函数的理由3.3头文件:命名约定3.4 iostream头文件3.5 cout对象3.5.1插入运算符3.5.2显式地限定cout对象3.5.3使用using声明来访问cout对象3.5.4使用using指令来访问cout对象3.6关于正确使用std命名空间的建议3.7 了解运算符的优先级3.8输出格式3.9 cin对象3.1O检查文件是否结束第4章引用变量4.1 概述4.2存在的问题4.3如何创建引用变量4.4所有的引用都必须初始化4.5 引用的作用4.6使用const限定引用4.7何时不需要使用引用4.8没有"常量引用"4.9创建对指针的引用4.10创建对数组的引用4.11 由函数返回引用第5章动态内存分配5.1 概述5.2如何为单个对象分配动态内存5.3如何初始化基本类型5.4空圆括号的含义5.5如何释放单个对象的空闲空间5.6如何为对象的数组分配空闲空间5.7如何释放对象数组的空闲空间5.8保持平衡5.9如何使用new和delete在空闲存储区中存储字符串5.10如何分配和删除多维数组5.11 命名该空间5.12两个程序输出示例第6章类6.1 概述6.2 C中的结构6.2.1 全局函数6.2.2 C存在的问题6.3初识封装6.3.1修订后的Circle抽象6.3.2必须支持常量对象6.4结构与类6.5类的用途6.6类的组件6.7如何编写类定义6.7.1 类声明与类定义6.7.2关于输入/输出类6.8数据隐藏的原则6.9访问限定符6.9.1 private关键字6.9.2 public关键字6.9.3 protected关键字6.9.4选择编码风格6.10模块化并实现隐藏6.10.1如何模块化6.10.2用户的任务6.10.3本节小结6.1 1 如何通过实例来访问类成员6.12 内联函数6.12.1 内联函数的含义6.12.2 内联函数与宏的对比6.12.3 使得内联函数对编译器有效6.12.4放置内联函数的地方6.12.5 内联函数的连接6.12.6如何编写全局成员内联函数6.12.7 如何编写类成员内联函数6.12.8隐式内联和显式内联的比较6.13 mutable关键字6.14如何显示类的内容6.15类中的枚举类型6.15.1使用枚举的原因6.1 5.2私有枚举6.1 5.3 公有枚举6.15.4 "Enum Hack"的作用第7章构造函数和析构函数7.1 概述7.2构造函数的定义7.2.1语法规则7.2.2何时不调用构造函数7.2.3编译器提供的默认构造函数7.2.4默认的构造函数:普遍定义7.2.5初始化常量对象7.2.6构造函数重载7.2.7不能直接调用构造函数7.3析构函数的定义7.3.1编译器提供的析构函数7.3.2析构函数的作用7.3.3编写您自己的析构函数7.3.4语法规则7.4如何实例化类并调用默认构造函数7.5如何实例化类并向构造函数传递参数7.6如何阻止使用默认构造函数的实例化7.7隐式类型转换7.8复制构造函数7.8.1默认复制构造函数7.8.2复制构造函数的语法7.8.3复制构造函数的数量7.8.4浅复制与深复制7.8.5编写您自己的复制构造函数7.8.6如何阻止对象复制7.9函数风格的强制转换7.10初始化与赋值7.11基/成员初始化列表7.11.1默认初始化7.11.2强制使用基/成员初始化列表7.11.3 另一种初始化调用的情况7.12关于指针7.13 形参名与类成员名7.14非静态数据成员的初始化顺序7.15 基本类型的数组作为非静态数据成员7.16用户自定义类型数组作为非静态数据成员7.17如何创建用户自定义实例的数组7.18如何声明常量数据成员数组7.19如何在空闲存储区中创建用户自定义类型7.20如何在空闲存储区中创建用户自定义类型的数组7.2l调用new时的语法第8章类的其他特征8.1 概述8.2 this指针8.2.1 解引用this指针来复制调用对象8.2.2解引用this指针以允许链接函数8.3静态类数据成员8.3.1 在类的定义中初始化静态类数据成员8.3.2静态成员函数8.3.3用于生成随机数的类8.3.4 Die类8.3.5 Dice类8.4类的大小8.5友元函数8.5.1 类如何授权一个函数作为它的友元函数8.5.2成员函数和非成员函数8.5.3 使用非成员非友元函数替代友元函数8.5.4在命名空间中声明类的友元函数8.6友元类8.7 类的封装8.8运算符转换函数8.8.1 用途8.8.2语法8.9类成员指针8.9.1全局函数指针8.9.2指向非静态类成员函数的指针8.9.3 使用指向非静态成员函数的指针调用函数8.9.4指向静态类成员函数的指针第9章异常处理9.1 概述9.2如何抛出异常9.3如何捕获异常9.4 catch代码块的匹配处理9.5异常处理的一个简单示例9.6释放堆栈9.7如果调用new失败怎么办9.8如何防止new抛出异常9.9异常的传播9.10如何处理指向空闲空间的指针9.11 不能销毁还没有创建的对象9.12重新抛出对象9.13 从子对象成员中捕获抛出的异常9.14function-try-blocks9.15子对象成员和指针的混合使用9.16对象的局部结构9.17编写异常.安全代码9.17.1 堆栈中的简单对象9.17.2堆栈中的对象数组9.17.3 空闲存储区中的简单对象9.17.4再论空闲存储区中的简单对象9.17.5 空闲存储区中的对象数组9.17.6再论空闲存储区中的对象数组9.18析构函数和异常处理9.19异常规范9.20 出错条件9.20.1 意外错误9.20.2终止错误9.21 编译器如何对待异常规范9.22为类定义operator new()函数第10章函数重载10.1 概述lO.2几个关于函数重载的示例10.3忽略返回类型10.4 const限定参数按值传递l0.5 const限定参数按指针传递10.6 const限定参数按引用传递10.7可变成员函数和常量成员函数10.8 重载决议10.9根据指针类型重载10.10名称重整10.10.1如何避免名称重整10.10.2类型.安全连接10.11运算符函数重载10.11.1运算符优先级表10.11.2重载运算符的命名10.11.3默认参数。10.11.4 C++自带的运算符10.11.5不能改变优先级10.11.6不能改变"Narity"10.11.7不能改变结合性10.11.8成员函数与非成员函数10.11.9至少支持一个类实例10.11.10中缀表示法和函数表示法10.11.1l 二元成员函数和隐式类型转换10.11.12多次重载或者允许隐式类型转换10.11.13运算符的重载10.11.14赋值运算符10.11.15函数调用运算符10.11.16下标运算符10.11.17间接成员运算符10.11.18复合赋值运算符10.11.19自增运算符和自减运算符10.11.20重载逗号运算符10.11.21重载逻辑与和逻辑或运算符10.11.22重载插入运算符10.11.23运算符小结第11章继承11.1 概述11.2 内存中的派生类实例1l.3 使用继承创建is-a关系11.4如何定义派生类11.5再论结构和类11.6 关键字protected11.7访问特权11.8基类"存取器"函数11.9修改继承访问11.10 函数隐藏11.11 派生类成员函数如何调用基类成员函数11.12管理函数11.12.1如何编写管理函数11.12.2派生类到基类的标准转换11.12.3 隐藏非成员函数11.12.4不要对数组进行向上类型转换11.1 3 多态性11.14多态性和虚函数11.14.1 友好的程序代码和不友好的程序代码11.14.2重写虚函数11.14.3虚析构函数11.14.4从基类的构造函数中调用虚函数11.1 5抽象基类11.15.1 再论关于贷款的示例11.15.2关于虚函数的异常规范11.16里氏代换原则11.17多重继承11.17.1 虚基类11.17.2初始化虚基类第12章模板12.1 概述12.2 函数模板12.2.1 不使用宏的原因12.2.2如何编写函数模板12.2.3优化代码12.2.4在何处使用函数模板12.2.5针对不同的参数类型进行实例化12.2.6显式地指定类型12.2.7默认的函数参数12.2.8完全特殊化函数模板12.2.9如何调用特殊化的函数12.2.10对特殊化和重载的选择12.2.11特殊化greater()函数模板12.3类模板12.3.1如何定义类模板12.3.2在类定义之外定义成员12.3.3实例化类模板12.3.4另一个模板的模板实例化12.3.5默认模板参数12.3.6在类模板中声明另一个友元类12.3.7在类模板中声明友元函数12.3.8特殊化类模板12.3.9在类模板中嵌入类模板12.3.10从类模板中派生新类12.4非类型模板参数12.4.1 默认的模板参数和特殊化12.4.2关于使用非类型模板参数的有趣示例12.5 成员模板12.6模板模式12.7关键字typename第13章运行时类型信息l3.1 概述13.2动态转型态13.3动态转型态是如何工作的13.4关键字typeid第14章输出流14.1 概述14.2实例std::cerr和std::clog14.3如何格式化输出14.3.1位格式标志14.3.2如何打开位格式标志14.3.3 如何以合适的基数显示整数14.3.4如何显示整数的基数设置14.3.5如何显示整数的符号14.3.6如何将输出显示为大写字母14.3.7如何显示字符14.3.8如何设置输出字段宽度14.3.9如何指定填充字符14.3.10如何指定字段对齐14.3.1 1 如何格式化浮点型数值14.4如何显示bool类型14.5如何显示地址14.6如何输出到内存缓冲区14.6.1 成员函数ostream::flush()14.6.2预定义的stdio和iostream流的混合使用第15章输入流l5.1 概述15.2如何检查错误15.2.1错误报告标志15.2.2访问成员函数15.2.3直接测试iostream对象15.2.4成员函数std::basic ios::clear()15.2.5如何清空输入流的缓冲区l5.3 字符输入15.3.1使用提取运算符实现对字符串的输入15.3.2限制输入字符的个数15.3.3使用std::istream::getline()实现字符串输入第16章操纵符16.1 概述16.2操纵符的格式16.3一些简单的操纵符l6.4 不带参数调用的内置操纵符16.5使用带有一个参数的操纵符16.6使用带有一个参数的内置操纵符第17章文件输入/输出17.1 概述17.2文件输入/输出类17.3文件输出17.3.1文件名参数17.3.2文件模式参数17.3.3验证文件是否打开17.3.4关闭打开的文件17.3.5输出磁盘文件示例1 7.4 文件输入1 7.5文件位置标记l 7.6 文件更新1 7.7 二进制模式17.8未格式化的输出17.9未格式化的输入17.10重定向I/O第1 8章string类与标准模板库18.1概述18.2 string类l8.3标准模板库18.3.1 std::vector类18.3.2迭代器18.3.3迭代器的类型18.3.4基于string的I/O18.3.5标准模板库中的算法18.3.6标准模板库的主要容器18.3.7比较对象附录A参考书目附录B C++准则

作者简介

暂缺《C++大学教程(第3版 国外计算机科学经典教材)》作者简介

图书目录

目    录第1章  由C迁移到C++ 11.1  概述 11.2  C与C++的比较 11.3  编译器如何识别C++程序 11.4  预处理器如何识别环境 21.5  新的注释风格 21.6  永远不要假定(隐式地使用int类型) 31.7  main()的默认返回值 31.8  声明与定义的区别 41.9  函数声明中的形参名称 41.10  函数定义中的形参名称 41.11  所有的函数在调用前必须先声明 51.12  空圆括号的含义 51.13  函数参数的默认值 51.14  初始化与赋值的区别 61.15  放置变量声明的地方 71.16  for循环内的变量声明 81.17  标记名成为类型名 81.18  C++与C中枚举类型的区别 91.19  初始化全局变量 101.20  数组初始化 111.21  布尔类型 111.22  void *指针 121.23  使用0,而不是宏NULL 131.24  关键字const 131.24.1  所有的常量必须初始化 131.24.2  将常量值的参数传递给函数的含义 141.24.3  函数返回值为常量的含义 141.24.4  const如何影响指针 141.24.5  C++与C中字符数组的区别 151.24.6  如何支持char const*类型的数组 161.24.7  C以及C++处理const方式的区别 161.24.8  使用const而不是#define 171.24.9  const 变量的连接 181.25  新的类型强制转换风格 181.25.1  类型强制转换以及转换的区别 181.25.2  类型强制转换的一般格式 191.25.3  static_cast 191.25.4  reinterpret_cast 201.25.5  const_cast 201.25.6  您不会犯错 211.26  C以及C++关键字 21第2章  命名空间 232.1  概述 232.2  存在的问题 232.3  如何创建命名空间 242.4  作用域分解运算符 252.5  如何访问命名空间的成员 252.5.1  直接访问命名空间的成员 252.5.2  using声明-- 访问命名空间成员的另一种方法 262.5.3  using 指令--访问命名空间成员的另一种方法 272.6  小心避免不明确的情况 282.7  无名的命名空间 282.8  命名空间的别名 292.9  Koenig 查找规则 30第3章  输入/输出基础 323.1  概述 323.2  使用新函数的理由 323.3  头文件-- 命名约定 333.4  iostream头文件 333.5  cout对象 333.5.1  插入运算符 343.5.2  显式地限定cout对象 343.5.3  使用using声明来访问cout对象 353.5.4  使用using指令来访问cout对象 353.6  关于正确使用std命名空间的建议 363.7  了解运算符的优先级 373.8  输出格式 373.9  cin对象 373.10  检查文件是否结束 39第4章  引用变量 424.1  概述 424.2  存在的问题 424.3  如何创建引用变量 444.4  所有的引用都必须初始化 444.5  引用的作用 444.6  使用const限定引用 454.7  何时不需要使用引用 464.8  没有“常量引用” 474.9  创建对指针的引用 474.10  创建对数组的引用 484.11  由函数返回引用 49第5章  动态内存分配 515.1  概述 515.2  如何为单个对象分配动态内存 515.3  如何初始化基本类型 525.4  空圆括号的含义 525.5  如何释放单个对象的空闲空间 535.6  如何为对象的数组分配空闲空间 535.7  如何释放对象数组的空闲空间 545.8  保持平衡 555.9  如何使用new和delete在空闲存储区中存储字符串 555.10  如何分配和删除多维数组 575.11  命名该空间 585.12  两个程序输出示例 58第6章  类 616.1  概述 616.2  C中的结构 616.2.1  全局函数 626.2.2  C存在的问题 626.3  初识封装 636.3.1  修订后的Circle抽象 636.3.2  必须支持常量对象 646.4  结构与类 646.5  类的用途 656.6  类的组件 656.7  如何编写类定义 656.7.1  类声明与类定义 666.7.2  关于输入/输出类 696.8  数据隐藏的原则 696.9  访问限定符 716.9.1  private关键字 726.9.2  public关键字 736.9.3  protected 关键字 736.9.4  选择编码风格 736.10  模块化并实现隐藏 746.10.1  如何模块化 756.10.2  用户的任务 776.10.3  本节小结 776.11  如何通过实例来访问类成员 776.12  内联函数 796.12.1  内联函数的含义 806.12.2  内联函数与宏的对比 806.12.3  使得内联函数对编译器有效 806.12.4  放置内联函数的地方 816.12.5  内联函数的连接 816.12.6  如何编写全局成员内联函数 816.12.7  如何编写类成员内联函数 826.12.8  隐式内联和显式内联的比较 846.13  mutable 关键字 846.14  如何显示类的内容 856.15  类中的枚举类型 876.15.1  使用枚举的原因 886.15.2  私有枚举 886.15.3  公有枚举 906.15.4  “Enum Hack”的作用 91第7章  构造函数和析构函数 947.1  概述 947.2  构造函数的定义 947.2.1  语法规则 957.2.2  何时不调用构造函数 957.2.3  编译器提供的默认构造函数 967.2.4  默认的构造函数:普遍定义 977.2.5  初始化常量对象 987.2.6  构造函数重载 987.2.7  不能直接调用构造函数 1007.3  析构函数的定义 1017.3.1  编译器提供的析构函数 1017.3.2  析构函数的作用 1017.3.3  编写您自己的析构函数 1027.3.4  语法规则 1027.4  如何实例化类并调用默认构造函数 1037.5  如何实例化类并向构造函数传递参数 1037.6  如何阻止使用默认构造函数的实例化 1047.7  隐式类型转换 1067.8  复制构造函数 1097.8.1  默认复制构造函数 1107.8.2  复制构造函数的语法 1117.8.3  复制构造函数的数量 1117.8.4  浅复制与深复制 1117.8.5  编写您自己的复制构造函数 1127.8.6  如何阻止对象复制 1147.9  函数风格的强制转换 1157.10  初始化与赋值 1187.11  基/成员初始化列表 1187.11.1  默认初始化 1207.11.2  强制使用基/成员初始化列表 1207.11.3  另一种初始化调用的情况 1217.12  关于指针 1237.13  形参名与类成员名 1237.14  非静态数据成员的初始化顺序 1237.15  基本类型的数组作为非静态数据成员 1257.16  用户自定义类型数组作为非静态数据成员 1257.17  如何创建用户自定义实例的数组 1267.18  如何声明常量数据成员数组 1287.19  如何在空闲存储区中创建用户自定义类型 1287.20  如何在空闲存储区中创建用户自定义类型的数组 1297.21  调用new时的语法 129第8章  类的其他特征 1348.1  概述 1348.2  this指针 1348.2.1  解引用this指针来复制调用对象 1368.2.2  解引用this指针以允许链接函数 1378.3  静态类数据成员 1398.3.1  在类的定义中初始化静态类数据成员 1428.3.2  静态成员函数 1438.3.3  用于生成随机数的类 1458.3.4  Die类 1458.3.5  Dice类 1478.4  类的大小 1518.5  友元函数 1528.5.1  类如何授权一个函数作为它的友元函数 1528.5.2  成员函数和非成员函数 1538.5.3  使用非成员非友元函数替代友元函数 1558.5.4  在命名空间中声明类的友元函数 1568.6  友元类 1588.7  类的封装 1628.8  运算符转换函数 1698.8.1  用途 1698.8.2  语法 1708.9  类成员指针 1718.9.1  全局函数指针 1718.9.2  指向非静态类成员函数的指针 1728.9.3  使用指向非静态成员函数的指针调用函数 1728.9.4  指向静态类成员函数的指针 173第9章  异常处理 1749.1  概述 1749.2  如何抛出异常 1749.3  如何捕获异常 1749.4  catch代码块的匹配处理 1769.5  异常处理的一个简单示例 1769.6  释放堆栈 1779.7  如果调用new失败怎么办 1779.8  如何防止new抛出异常 1789.9  异常的传播 1799.10  如何处理指向空闲空间的指针 1819.11  不能销毁还没有创建的对象 1849.12  重新抛出对象 1849.13  从子对象成员中捕获抛出的异常 1849.14  function-try-blocks 1859.15  子对象成员和指针的混合使用 1879.16  对象的局部结构 1899.17  编写异常-安全代码 1909.17.1  堆栈中的简单对象 1909.17.2  堆栈中的对象数组 1919.17.3  空闲存储区中的简单对象 1919.17.4  再论空闲存储区中的简单对象 1929.17.5  空闲存储区中的对象数组 1939.17.6  再论空闲存储区中的对象数组 1959.18  析构函数和异常处理 1969.19  异常规范 1969.20  出错条件 1979.20.1  意外错误 1989.20.2  终止错误 1989.21  编译器如何对待异常规范 1989.22  为类定义operator new()函数 199第10章  函数重载 20310.1  概述 20310.2  几个关于函数重载的示例 20310.3  忽略返回类型 20410.4  const限定参数按值传递 20410.5  const限定参数按指针传递 20410.6  const限定参数按引用传递 20510.7  可变成员函数和常量成员函数 20510.8  重载决议 20610.9  根据指针类型重载 20710.10  名称重整 20710.10.1  如何避免名称重整 20810.10.2  类型-安全连接 20910.11  运算符函数重载 21010.11.1  运算符优先级表 21110.11.2  重载运算符的命名 21310.11.3  默认参数 21310.11.4  C++自带的运算符 21310.11.5  不能改变优先级 21410.11.6  不能改变“Narity” 21410.11.7  不能改变结合性 21410.11.8  成员函数与非成员函数 21410.11.9  至少支持一个类实例 21510.11.10  中缀表示法和函数表示法 21510.11.11  二元成员函数和隐式类型转换 21610.11.12  多次重载或者允许隐式类型转换 21810.11.13  运算符的重载 21910.11.14  赋值运算符 22010.11.15  函数调用运算符 22310.11.16  下标运算符 22510.11.17  间接成员运算符 22610.11.18  复合赋值运算符 22910.11.19  自增运算符和自减运算符 23110.11.20  重载逗号运算符 23310.11.21  重载逻辑与和逻辑或运算符 23310.11.22  重载插入运算符 23410.11.23  运算符小结 235第11章  继承 23811.1  概述 23811.2  内存中的派生类实例 23811.3  使用继承创建is-a关系 23811.4  如何定义派生类 23911.5  再论结构和类 24011.6  关键字protected 24011.7  访问特权 24111.8  基类“存取器”函数 24211.9  修改继承访问 24311.10  函数隐藏 24511.11  派生类成员函数如何调用基类成员函数 24811.12  管理函数 24911.12.1  如何编写管理函数 25011.12.2  派生类到基类的标准转换 25411.12.3  隐藏非成员函数 25511.12.4  不要对数组进行向上类型转换 25711.13  多态性 25711.14  多态性和虚函数 26211.14.1  友好的程序代码和不友好的程序代码 26311.14.2  重写虚函数 26311.14.3  虚析构函数 26511.14.4  从基类的构造函数中调用虚函数 26611.15  抽象基类 26611.15.1  再论关于贷款的示例 26711.15.2  关于虚函数的异常规范 26711.16  里氏代换原则 26811.17  多重继承 27011.17.1  虚基类 27311.17.2  初始化虚基类 274第12章&

本目录推荐