迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

C++ 中的类模板继承

作者:迹忆客 最近更新:2023/08/23 浏览次数:

本文将讨论 C++ 中最流行和最常用的方法之一(即类模板)。

C++ 中模板的添加带来了一种新的编码范式,称为通用编程。 现在,这是 C++ 程序员工具包的一个重要元素,是许多标准库的基础,也是我们许多新 C++ 开发者以前从未遇到过的东西。

泛型编程有时与面向对象编程中的继承概念形成对比。 另一方面,真正的多范式方法需要研究两者如何相互作用。


C++ 中的模板

在 C++ 中,模板是一个基本但功能强大的工具。 基本思想是将数据类型作为参数传递,从而无需为多种数据类型编写相同的代码。

例如,软件业务可能需要对多种数据类型进行 sort()。 我们可以构造一个单一的 sort() 函数并将数据类型作为参数传递,而不是编写和维护大量代码。

C++ 添加了两个新关键字来支持模板:template 和 typename。 关键字 class 始终可以用来代替第二个关键字。

句法:

template <typename T>
void myFunction(T var )
{
    //function definition
}

在上面显示的语法中,我们可以看到,为了定义接受模板变量作为参数的函数,我们添加了一行 template。 现在,该函数可以接受任何数据类型的参数; 它是用于 int、char 和许多其他数据类型的通用函数。


模板在 C++ 中如何工作

模板在编译过程中会扩展。 这与宏类似。

另一方面,编译器在模板扩展之前执行类型检查。 这个概念很简单:源代码仅包含一个函数或类,而生成的代码可能具有同一函数或类的多个副本。

下面的示例对此进行了详细说明。

#include<iostream>
using namespace std;

template <typename T>
T checkMaxValue (T a, T b)
{
    if (a > b)
        return a;
    else if (b > a)
        return b;
    else
        return 0;
}

//driver program
int main()
{
    cout << checkMaxValue (102,204)<<endl;   //int value
    cout << checkMaxValue ('c','f') <<endl;  // char value
}

请注意,我们在驱动程序的第一行中向函数传递了两个整数,它最终将返回两个整数中的最大值。 我们在第二行将两个 char 值传递给同一个函数,该函数将返回最大的 char 值。

在编译时,我们调用该函数,如下所示:

int checkMaxValue (int a, int b)

对于第二次调用,我们编写以下内容:

char checkMaxValue (char a, char b)

我们可以看到,根据调用函数时传递的变量类型,在编译时创建了同一函数的多个副本。

我们可以使用函数和类的模板。 我们将讨论这两种类型以及如何实现这两种类型。


C++ 中的函数模板

我们将创建一个可以处理各种数据类型的通用函数。 Sort()、max()、min() 和 printArray 是函数模板的示例。

示例代码:

template <class T>
void sortArray(T arr[], int s)
{
    for (int i = 0; i < s - 1; i++)
        for (int j = s - 1; i < j; j--)
            if (arr[j] < arr[j - 1])
            {
                int var = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = var;
            }
    cout << " Sorted array : ";
    for (int i = 0; i < s; i++)
        cout << arr[i] << " ";
    cout << endl;

}

// Driver Code
int main()
{
    int a[5] = { 10, 50, 30, 40, 20 };
    int n=5;
    sortArray<int>(a, n);

    char c[5] = {'g','a','i','h','e'};
    sortArray<char>(c, n);
    return 0;
}

输出:

函数模板输出

在代码片段中,我们创建了一个函数 sortArray(),它可以接受数组的模板类型和该数组的大小值并打印排序后的数组。 我们在主代码中为两种不同的数组类型调用了它:int 和 char 数组。

因此,我们可以使用任何数据类型,并且相同的函数都可以工作。 它节省了时间和空间,并且在通用编程中也很高效。


C++ 中的类模板

当类定义不依赖于数据类型的内容时,类模板与函数模板一样非常方便。 LinkedList、BinaryTree、Stack、Queue、Array 和更多类可以从类模板中受益。

句法:

template <class T>
class className {
    private:
        T a;
        ... .. ...
    public:
        T myFunc(T x);
        ... .. ...
};

在此语法中,T 是用作数据类型占位符的模板类型。 当为此模板类创建对象时,使用以下语法:

className<dataType> objectName;

同样,我们可以使用以下语法来编写它:

className<int> objectName;
className<double> objectName;

示例:

#include<iostream>
using namespace std;

template <class T>
class Number {
    private:
    T numb;

    public:
    Number(T a) : numb(a) {}

    T get() {
        return numb;
    }
};

int main() {

    Number<int> integerNumber(50);
    Number<double> doubleNumber(8.9);
    cout << "integer Number = " << integerNumber.get() << endl;
    cout << "double Number = " << doubleNumber.get() << endl;
    return 0;
}

输出:

类模板输出

您可以在这个示例中看到,同一个类可以接受整数和双精度数。 这个例子非常通用,可以让您理解类模板的概念。

这个概念可以扩展,许多类可以使用 LinkedList、Stack、Queue 等模板来实现。


C++ 中的类模板继承

从模板类继承是可行的。 所有常规继承和多态性规则均适用。

如果我们需要新的派生类具有通用性,则必须将其设为模板类,并将模板参数发送到基类。 这是因为继承只能通过类来实现,而模板不是类,除非通过向其传递某种数据类型来实例化模板。

句法:

template <class T>
class derived : public Base<T>{};

输出:

#include <iostream>
using namespace std;

template<class T>
class Base {
    private:
        T val;

    public:
        void setVal(T a)
        {
            val = a;
        }
};
template<class T>
class Derived : public Base<T> {
    public:
        void setVal (T b)
        {
            Base<T>::setVal(b);
        }
};
int main()
{
    Derived<int> a;
    a.setVal(4);
    return 0;
}

我们在代码片段中创建了一个基类模板,其中包含模板类型变量和成员函数。 此外,我们创建了一个派生类,它也是一个类模板并扩展了基类模板。

当扩展Base类时,我们必须指定模板变量,如Base<T>。 基类是泛型的,派生类也是泛型的。

派生类也可以有其模板参数。 前面的示例可以修改如下:

template<class T , class S>
class Derived : public Base<T> {
    private:
        S data;
    public:
        void setVal (T b)
        {
            Base<T>::setVal(b);
            data = b;
        }
};

所以,我们可以看到继承也可以使用类模板来实现。 此外,我们可以使用类模板来实现多态性和适配器类。

上一篇:C++ 中的Point 和 Line 类

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C++ 中的Point 和 Line 类

发布时间:2023/08/23 浏览次数:158 分类:C++

C++ 中的 Point 和 Line 类是可以表示点和线的主要数据类型。 它提供了操作点、条形和向量的方法。C++ 中 Point 和 Line 类的基本用例 Point 和 Line 类是 C++ 语言的基本部分。

在 C++ 中获取类名

发布时间:2023/08/23 浏览次数:100 分类:C++

在本文中,我们将学习如何使用 C++ 编程语言获取类名。C++ 类概述 在 C++ 中,一切都与类和对象相关,每个类和对象都有其特征和过程。

在 C++ 类中初始化静态变量

发布时间:2023/08/23 浏览次数:52 分类:C++

我们将在这篇短文中学习如何在 C++ 中初始化静态变量。在 C++ 中初始化静态变量 C++类中静态变量的初始化就是给静态变量赋值的过程。

C++ 中的垃圾收集

发布时间:2023/08/23 浏览次数:148 分类:C++

在本文中,我们将了解 C++ 中的垃圾收集。垃圾收集作为一种内存管理技术 垃圾收集是编程语言中使用的内存管理技术之一。 它是一种自动内存管理技术,作为许多编程语言的功能添加。

在 C++ 中分配和释放内存

发布时间:2023/08/23 浏览次数:70 分类:C++

C++ 编程语言提供了几个分配和释放内存的函数。 这些函数包括 malloc、calloc、realloc、free、new 和 delete。让我们从 new 和 delete 运算符开始。使用 new 和 delete 运算符分配和释放内存

查找 C++ 中的内存泄漏

发布时间:2023/08/23 浏览次数:70 分类:C++

本文将使用 C++ 编程语言解释内存泄漏、其原因、如何识别它们以及如何防止它们。C++ 中的内存泄漏 如果程序员先前分配给一个目的的部分内存被用于另一个目的,则称内存“泄漏”。

C++ 中的虚函数

发布时间:2023/08/23 浏览次数:200 分类:C++

本文将介绍 C++ 中的虚函数。 虚函数是特殊的成员函数,它们被声明的派生函数重载或重写,但在基类中定义和声明。C++ 中的虚函数 关键字 virtual 位于基类中函数声明之前。

C++ 中的余切函数

发布时间:2023/08/23 浏览次数:58 分类:C++

本文是关于 C++ 中三角函数的求解。 许多函数在数学库中很容易获得,但有些函数不可用,例如余切函数。对于这样的函数,我们将实现一些高效的用户定义函数。C++ 中的三角函数

C++ 错误 Error: Cannot Call Member Function Without Object

发布时间:2023/08/22 浏览次数:199 分类:C++

本文介绍了使用C++进行面向对象编程时,常见的错误“无法调用没有对象的成员函数”。 此外,它还提供了对该错误的潜在修复。修复C++中 Error: Cannot Call Member Function Without Object 错误

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便