| |
|
开发:
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语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/23 19:16:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |