前言

C++除了函数模板,还有类模板。类模板是针对成员数据类型不同的类的抽象。这里简单记录一下,方便自己查阅和学习。

正文

类模板是针对成员数据类型不同的类的抽象,它不是一个具体实际的类,而是一个类型的类,一个类模板可以生成多种具体的类。

针对成员数据类型

格式

template<typename 类型占位符T> 
class 类名 
{ 
    T 成员变量;
    ...
}

下面举个例子来说

template<typename T>
class Book {
private:
    T page;
public:
    T getPage() {
        return page;
    }
    void setPage(T page) {
        this->page = page;
    }
};

T可以是int,也可以long等类型。

Book<int> book;
book.setPage(100);
int page = book.getPage();
std::cout << page << std::endl;

当然也可以定义多个类型。

template<typename T, typename Y>
class Book {
private:
    T page;
    Y value;
public:
    void setPage(T page) {
        this->page = page;
    }
    void setValue(Y value) {
        this->value = value;
    }
};

使用也是差不多的。

Book<int, float> book;
book.setPage(100);
book.setValue(88.8f);

类模板的派生

类模板和普通类一样也可以继承和派生,以实现代码复用。类模板的派生一般有三种情况:类模板派生普通类、类模板派生类模板、普通类派生类模板。

类模板派生普通类

在C++中,可以从任意一个类模板派生一个普通类。

在派生过程中,类模板先实例化出一个模板类,这个模板类作为基类派生出普通类。

template<typename T>
class Book {
private:
    T page;
public:
    Book(T page) :page(page){
    }
    void setPage(T page) {
        this->page = page;
    }
    T getPage() {
        return this->page;
    }
};

class XiaoShuo : public Book<int> {
private:
    int cPage;
public:
    XiaoShuo(int page, double value):cPage(page) , Book(page) {
    }
};

其实就是在继承时传入基础类型,子类XiaoShuo就是一个普通类了。

类模板派生类模板
template<typename T>
class Book {
private:
    T page;
public:
    Book(T page) :page(page) {
    }
    void setPage(T page) {
        this->page = page;
    }
    T getPage() {
        return this->page;
    }
};

template<typename T, typename U>
class KeHuan :public Book<T> {
public:
    U value;
    KeHuan(T t, U u) :Base<T>(t), value(u) {

    }
    //略
};

有点绕,继承模板类,然后又把子类也变成一个模板类,也就是类型未知。

//使用如下
KeHuan<int, double> kehuan(100, 23.5f);
普通类派生类模板

普通类也可以派生类模板,普通类派生类模板可以把现存类库中的类转换为通用的类模板。

简单的说就是继承类中是模板,还有未知类型。

实际编程中,这种派生方式并不常用,略过。

小结

由于模板类的类型未知,因此定义时需要显式带上对应的类型。

Book<int, float> book;
KeHuan<int, double> kehuan(100, 23.5f);

其他的跟普通函数使用一样。

参考文章

  1. 《C++程序设计教程(第2版)》

相关文章

暂无评论

none
暂无评论...