浅谈c++的模板机制(二) -- 类模板

初探类模板

上一篇文章简单介绍了c++的模板机制以及函数模板:浅谈c++的模板机制(一) – 函数模板
这篇文章主要介绍c++的类模板。先来看一个具体实例:

template <typename T>
class A
{
private:
    T a;
public:
    A(T a = 0)
    {
        this->a = a;
    }
    void printA()
    {
        cout << "A: " << a << endl;
    }
};

上面这个类A就是一个模板类。a的类型是 T, 而不是一个具体的类型,a的类型随着类A对象的建立而改变。模板类是抽象的,并没有在内存中分配存储空间。如果想创建类A的对象,如下:

A<int> a1(11);  // 模板类是抽象的  ==》需要进行类型具体化
a1.printA();

这样便创建了一个int型的A对象。

类模板做函数参数

前面已经提到过,类模板是一个抽象的概念,因此不能直接做函数形参;如果需要将一个类模板传给一个函数,那么需要将其具体化,如下:

void useA(A<int> &a)
{
    a.printA();
}

一个类模板的完整程序:

# include <iostream>

using namespace std;

template <typename T>
class A
{
private:
    T a;
public:
    A(T a = 0)
    {
        this->a = a;
    }
    void printA()
    {
        cout << "A: " << a << endl;
    }
};

// 类模板做函数参数
void useA(A<int> &a)
{
    a.printA();
}

int main(void)
{
    A<int> a1(11);  
    a1.printA();

    useA(a1);
    return 0;
}

在win 10 vs2017下运行结果:

A: 11
A: 11
请按任意键继续. . .

类模板的继承

从一个类模板派生出一个普通类

从一个类模板派生出一个普通类时,c++编译器需要知道父类是什么类型的,只有这样才能为它分配内存。因为派生出的是一个普通类,普通类就意味着内存大小是确定的。另外注意派生类构造函数的写法。

template <typename T>
class A
{
protected:
    T a;
public:
    A(T a = 0)
    {
        this->a = a;
    }
    void printA()
    {
        cout << "A: " << a << endl;
    }
};

class B : public A<int>
{
public:
    B(int a = 10, int b = 20) : A<int>(a)
    {
        this->b = b;
    }
    void printB()
    {
        cout << "a: " << a << "b: " << b << endl;
    }
private:
    int b;
};

完整程序:

# include <iostream>
using namespace std;

template <typename T>
class A
{
protected:
    T a;
public:
    A(T a = 0)
    {
        this->a = a;
    }
    void printA()
    {
        cout << "A: " << a << endl;
    }
};

class B : public A<int>
{
public:
    B(int a = 10, int b = 20) : A<int>(a)
    {
        this->b = b;
    }
    void printB()
    {
        cout << "a: " << a << "b: " << b << endl;
    }
private:
    int b;
};

int main(void)
{
    B b1(1, 2);
    b1.printB();
    b1.printA();
    return 0;
}

在win 10 vs2017下运行结果:

a: 1b: 2
A: 1
请按任意键继续. . .

从一个类模板派生出一个类模板

这种情况下派生类还是一个模板类。如下:


template <typename T>
class C : public A<T>
{
private:
    T c;
public:
    C(T c, T a) : A<T>(a)
    {
        this->c = c;
    }
    void printC()
    {
        cout << "C : " << c << endl;
    }
};

完整程序:

template <typename T>
class A
{
protected:
    T a;
public:
    A(T a = 0)
    {
        this->a = a;
    }
    void printA()
    {
        cout << "A: " << a << endl;
    }
};

template <typename T>
class C : public A<T>
{
private:
    T c;
public:
    C(T c, T a) : A<T>(a)
    {
        this->c = c;
    }
    void printC()
    {
        cout << "C : " << c << endl;
    }
};
int main(void)
{
    C<int> c(1, 2);
    c.printC();
    return 0;
}

在win 10 vs2017下运行结果:

C : 1
请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/williamgavin/article/details/80720988