C++类模板继承部分知识及测试代码

目录

0.前言

1.类模板基本使用

2.类模板继承

2.1类模板继承过程中的模板参数

情况1:父类非模板,子类为模板

情况2:父类模板,子类为非模板

情况3:父类模板,子类为模板

3.STL中的模板类分析

3.1STL中list继承关系

3.2STL中vector继承关系

后续补充


0.前言

本篇将整理类模板部分知识点。因为相关知识点可能较多,所以后面会将相关内容不断补充到这篇文章中。

1.类模板基本使用

类模板基本使用是这样的:

cpp 复制代码
// 类模板继承
#include<iostream>

template <typename T>
class Base {
public:
    T data;
    Base(T val) : data(val) {}
};

template <typename T>
class Derived : public Base<T> {
public:
    Derived(T val) : Base<T>(val) {}
    void print() {
        std::cout << "Derived data: " << this->data << std::endl;
        // std::cout << "Derived data: " << data << std::endl;
    }
};

int main(void){
    Derived<int> d(42);
    d.print(); // 输出: Derived data: 42
    return 0;
}

此外,还有一个很阴间的用法,类模板模板参数,它的使用大概是下面这样的:

cpp 复制代码
#include<vector>
template<typename T>
using vector = std::vector<T>;
template<typename T,template<typename U> class Con>
class Container {
public:
    Con<T> item;
    Container(T val) {
        item.push_back(val);
        std::cout << "Container initialized with value: " << val << std::endl;
    }
    
    void display() {
        for(auto & elem : item) {
            std::cout << elem << " ";
        }     
    }
};

int main(void){
    Container<int, vector> c(100);
    c.display(); // 输出: Container holds: 100
    return 0;
}

2.类模板继承

2.1类模板继承过程中的模板参数

情况1:父类非模板,子类为模板

严格来说,不算类模板继承,但是也列举在这里。代码如下:

cpp 复制代码
class Base {
public:
    int data;
    Base(int val) : data(val) {}
};

template <typename T>
class Derived : public Base{
public:
    Derived(T val) : Base(val) {}
    void print() {
        std::cout << "Derived data: " << this->data << std::endl;
        // std::cout << "Derived data: " << data << std::endl;
    }
};
情况2:父类模板,子类为非模板

这种情况可能不严谨,但是从内存角度来说,它的意思是父类对应的内存由实例化确定,子类内存是确定的。

cpp 复制代码
template <typename T>
class Derived : public Base<T>{
public:
    Derived(int val) : Base<T>(val) {}
    void print() {
        std::cout << "Derived data: " << this->data << std::endl;
        // std::cout << "Derived data: " << data << std::endl;
    }
};
情况3:父类模板,子类为模板

这种情况是比较典型的模板类继承,代码如下:

cpp 复制代码
template <typename U,typename T>
class Derived : public Base<T>{
public:
    Derived(T val) : Base<T>(val) {}
    void print() {
        std::cout << "Derived data: " << this->data << std::endl;
        // std::cout << "Derived data: " << data << std::endl;
    }
};

3.STL中的模板类分析

3.1STL中list继承关系

下图为GCC 8.1.0的list的继承关系图,你知道它的大小吗?

如果对继承和包含不熟悉可以移步另一篇文章:

C++继承和包含知识及测试代码-CSDN博客

已知条件为:

(1)空心箭头表示继承(is-a),实心箭头表示包含(has-a);

(2)_List_node_base包含的两个元素是指针类型。

(3)_M_size为 unsigned long long类型

----------------------------------------------------------分割线--------------------------------------------------------------

其实list的大小和以下这个结构体是相等的。其中两个指针对应着链表(双向)节点的中的两个指针,另外一个对应链表的长度信息。在64bit编译器中,我输出的结果是24字节。

cpp 复制代码
struct A{
    _List_node_base* a;
    _List_node_base* b;
    unsigned long long c;
};

更直观的,如果对vscode熟悉的话,可以看一下debug界面。如下图,是不是对list结构更清晰了一点呢?

3.2STL中vector继承关系

看完了list,看下常用的vector,它相对要简单一些,可以看出它的大小吗?

已知条件为:

_Vector_impl包含的三个元素都是指针类型。

----------------------------------------------------------分割线--------------------------------------------------------------

同样的,在64bit编译器中,我输出的结果是24字节。在vscode中,可以看到其内存布局如下图:

后续补充

此部分由于比较复杂,后续会继续补充!

相关推荐
JavaPub-rodert几秒前
我又把自己的 Go 后台管理系统升级了一遍:文件管理、2GB 上传、私有文件预览、Docker 镜像全安排上了
开发语言·docker·golang·shiyuadmin
HiDev_5 分钟前
【非标自动化】plc执行顺序问题、扫描周期问题
深度学习·算法·机器学习
动力 continue6 分钟前
Python 元类与异常类:类的“制造工厂”与“报错定制师”
开发语言·python·制造
quantdash_cc6 分钟前
基于 QuantDash 5 分钟 K 线的网格交易策略参数网格搜索寻优实战
android·开发语言·pandas·量化·quantdash
147API14 分钟前
Python批量生成蒸馏数据,并发、重试、幂等和断点续跑
开发语言·jvm·python
青 春 记 忆16 分钟前
零基础入门python04:用注册校验理解字典、集合和条件判断
开发语言·vscode·python·python3.11
kels889919 分钟前
实战排坑:黄金实时API开发,XAUUSD Tick报文异常处理实践
开发语言·python·websocket·网络协议·信息可视化
阿pin24 分钟前
Java随笔-JDK7 HashMap头插法为何能导致死循环?
java·开发语言·hashmap
FBI HackerHarry浩26 分钟前
Pandas 库中用于分类变量独热编码(One-Hot Encoding)的函数 pd.get_dummies() 函数
开发语言·人工智能·python·pandas
高洁0133 分钟前
工信部教考中心证书-人工智能系列本系列
人工智能·python·深度学习·算法