首页 > 编程语言 >[Primer] 第 14 章 C++ 中的代码重用

[Primer] 第 14 章 C++ 中的代码重用

时间:2023-03-08 21:55:19浏览次数:40  
标签:14 继承 成员 使用 C++ template 基类 Primer 模板

第 14 章 C++ 中的代码重用

14.1 包含对象成员的类

类初始化列表中有多个项目时,初始化的顺序为在类中的声明顺序而不是列表顺序。

14.2 私有继承

使用私有继承,基类的所有公有成员和保护成员都将成为派生类的私有成员,基类方法将不再成为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。私有继承获得实现,但不获得接口。

可以通过私有继承多个基类实现 has-a 关系,类似于使用成员变量。

私有继承可以提供两个无名的基类成员。

公有继承中使用构造函数的初始化成员列表 Student(const string &name): m_name(name) { ... };,而在私有继承中则使用类名代替成员名 Student(const string &name): std::string(name) { ... };

使用包含时使用对象名调用方法,私有继承则使用类名和作用域解析运算符调用方法。

使用强制类型转换 const String & Student::Name() const { return (const string &) *this; } 来获取基类对象的引用。

大多数时候应该使用包含,如果新的类需要访问原有类的保护成员或重新定义虚函数,则应该使用私有继承。

使用保护继承,基类的所有公有成员和保护成员都将成为派生类的保护成员,基类的接口将仅在派生类中可用。

为了使基类公有成员在保护继承或私有继承的派生类外可用,可用在派生类中重新声明同名方法并实现,或使用 using 声明公有函数。

14.3 多重继承

当继承多个具有相同祖先的基类时会出现问题。

SingerWaiter 中派生出类 SingerWaiter。将派生类对象指针赋给基类指针将出现问题,即 SingerWaiter sw; Worker *w = &sw; 会出现二义性。这是应当使用强制类型转换,即 Worker *w = (Singer *) &sw; 以指定类型。

将类声明为虚基类可以使派生的对象只继承一个基类对象,声明为 public Singer: virtual public Worker { ... }; 即可,但这样做会要求修改已有的代码。

多重继承时,构造函数可能会出现基类构造函数经过多条途径被多次调用,这时编译器将调用该参数的默认构造函数,否则需要在初始化列表中单独显式调用基类构造函数。

多重继承还可能导致函数调用的二义性,需要使用作用域解析运算符指定具体的基类函数。

14.4 类模板

template <class T> 开头的类声明为模板类,每个函数头也应该以相同的模板声明开头,类限定符也需要加上 <T>

使用内置类型或类对象用作实例化的类型名称是可行的,指针同样也可行,但可能需要修改类模板进行移动指针的操作。

使用模板头 template <class T, int n> 将同时指出一个非类型参数,在实例化时 n 必须为常量表达式。可以使用多个类型参数 template <class T1, class T2> 或设置模板类的默认类型 template <class T1, class T2 = int>

声明类模板对象 ArrayTP<int, 10> stuff; 时会实现隐式实例化,使用关键字 template 并指出类型 tmeplate class ArrayTP<int, 10>; 时会实现显式实例化。

当需要为特定类型的类模板进行修改时,可以创建显式具体化。首先声明通用类模板 template <class T> class SortedArray{ ... };,再进行具体化 template <> class SortedArray<const char *> { ... };。当请求 SortedArray<const char *> 时将使用具体化而不是通用模板。

首先声明通用类模板 template <class T1, class T2> class Pair { ... };,然后进行部分具体化 template <class T1> class Pair<T1, int> { ... };,当指定所有类型将会编变成显式具体化。

模板还可以用于结构、类或模板类的成员,也可以用作模板本身的参数。模板类声明也可以有友元函数。

使用 template<class T> using arrtype = std::array<T, 12>; 为模板提供别名。

标签:14,继承,成员,使用,C++,template,基类,Primer,模板
From: https://www.cnblogs.com/futureknight/p/17196408.html

相关文章

  • gcc 编译 C/C++ 文件
    gcc编译C/C++文件众所周知,C/C++程序想要得到执行,主要需要执行编译和链接两个过程,这个过程比较繁琐,尤其是程序使用到了其他的头文件的时候。gcc是常用的编译工具,其流程主要......
  • (P01)C++介绍
    文章目录​​1.需要掌握的重要练习​​​​2.为什么要学习C++​​​​3.C++为什么难学​​​​4.C++11值得学习的新特性​​​​5.几本推荐学习C++的书​​​​6.开发工具......
  • (P03)从C到C++:域运算符,new,delet运算符,重载,name managling与extern “C“,带默认参数的函
    文章目录​​1.域运算符​​​​2.new、delete运算符​​​​3.重载​​​​4.namemanagling与extern“C”​​​​5.带默认形参值的函数​​​​6.带默认形参值的函数的......
  • (P05)从C到C++:内联函数,带参数宏,4种强制类型转化
    文章目录​​1.内联函数​​​​2.4种新的类型转换运算符​​1.内联函数当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系......
  • [Primer] 第 13 章 类继承
    第13章类继承13.1一个简单的基类使用classChild:publicParent{...}进行公有派生,基类的公有成员将成为派生类的公有成员,基类的私有部分也将成为派生类的一部......
  • C/C++校园核酸检测管理程序[2023-03-08]
    C/C++校园核酸检测管理程序[2023-03-08]2022级课程设计1(程序设计语言C)参考题目及需求说明题目:校园核酸检测管理程序1程序使用人员采集员、检测员、待检者。为了......
  • C/C++餐厅信息管理程序[2023-03-08]
    C/C++餐厅信息管理程序[2023-03-08]二、餐厅信息管理程序基本要求:1.要求实现客户点菜的过程、客户结账、账目的管理、餐厅系统的维护四大功能模块,每个功能模块又分别对......
  • vscode-使用ctrl+shift+p搜索C/C++: Edit configurations显示no matching command问题
    问题在vscode中,使用ctrl+shift+p组合键调出命令窗口,输入c/c++:EditConfigurations后提示nomatchingcommand。解决方法在Extensions中,安装c/c++拓展后,重启vscode,即......
  • C++ JSON库json11的使用方法
    提纲1、下载并集成到自己的项目2、基本用法1下载并集成到自己的项目json11是一个轻量级的C++11库,提供JSON的序列化和反序列化功能。首先用gitclonehttps://gith......
  • 冒泡排序(简单C++实现)
    实现代码如下://bubble_sort.cpp#include<stdio.h>voidprintArray(intarr[],intlen);//冒泡排序:最多进行n-1次排序intmain(){intarr[]={23,39,65,2......