IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 编程参考 - 使用模板方式来实现继承 -> 正文阅读

[C++知识库]编程参考 - 使用模板方式来实现继承

关于继承的理解

C++中的类其实和C中的结构体差不多,都是自定义的数据结构,可以包含多个成员。这些成员在内存空间内按顺序连续存放,并且其访问作用域限定于结构体或类内部。

与C不同的是,类里面还可以包含方法。类方法的访问也限定在类内部的作用域,或者在C++中叫命名空间,类本身可以看作一个命令空间。

但C++是支持继承的,一个派生类继承了基类,就是将基类的成员也包含进来。同时此类的作用域内增加了基类的方法。

我们使用了继承的语法,翻译给编译器来说就是将基类里的内容也包含进来。类似于预处理的工作。这种机制节省了代码量,减少了工作量。但实际的结果来说还是一样的。举例来说:

class A {

public:

????int a;

};

class B: public A {

public:

? ? int b;

};

上面定义的类B,其实就是:

class B {

public:

? ? int a;

? ? int b;

};

只不过我们将B的定义分成了两部分,一部分在A类里,一部分在B类里,并且A和B两个类有继承的关系,可以使用多态功能。

关于模板的理解

模板这种机制也是为了帮助程序员减少工作量,降低复杂度,提高效率而产生的技术。

比如:

#include <stdio.h>

#include <string>

using namespace std;

template <class T>

class A{

public:

??A(){}

??A(int b, T _t):val(b),t(_t){}

? T t;

? int val;

};

int main()

{

??A<string> a(1, "hello");

??return 0;

}

而实际上,在使用模板类的时候,编译器在后台帮你根据模板类型,自动生成了相应的类的定义,只是这种处理是开发人员不可见的。

按照上面的例子,使用:?A<string> a(1, "hello"); 时,就会生成一个包含string类型的类。如下所示:

class A{

public:

??A(){}

??A(int b, string _t):val(b),t(_t){}

??string t;

??int val;

};

如果你换一个模板参数,就会多定义一个相应类型的类。只是这些代码是中间产物,你看不见,但实际存在。

使用模板参数来作为基类

既然继承和模板都可以看作一种在代码形式上的组合,那能不能组合使用呢?是可以的。

可以使用模板来表示继承,会有更大的灵活性。

把一个类的基类定义为模板参数,这样在使用时,想继承哪个类就继承哪个类。根据需要决定使用哪个基类。

比如下面:

#include <stdio.h>

class A{

????????public:

????????void helloA(){printf("helloA.\n");}

};

template <class T>

class B : public T

{

};

int main()

{

??B<A> b;

??b.helloA();

? return 0;

}

$ g++ -o test main.cpp

$ ./test

helloA

所以,我们利用了模板,将基类作为模板参数,使类的定义更加灵活。

这样避免了类的继承链的唯一性,可以像搭积木一样进行配置。

还可以将类的成员也作为模板参数,将其添加到模板参数中即可。

这种将模板参数作为基类的方法,有些场景下使用更加方便。

比如有A,B两个类,具有像相似的接口,但不同的功能。

你自己想定义的类,可能会用到A的功能,或者B的功能。

正常的话,你可能要定义两个类,一个继承A,一个继承B。

但这样就要定义两个类,可能这两个类除了基类不同,其他方面是一样的。

这时如果用模板来表示的话,就不会用重复代码,而且用起来很方便。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:40:56  更:2022-05-10 11:41:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 0:06:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码