前言
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);
其他的跟普通函数使用一样。
参考文章
© 版权声明