C++的模板与类属类

1.类属类

按照类定义中是否带参数,类可分为类属类非类属类,采用参数化类型定义的类(也称为 类模板)称为类属类(generic class),或参数 化类(parameterized class)。它仅仅是描述 了一组类型的通用样板。反之,非类属类就是定义中不带参数的类。

由于类属类里面所处理的对象的数据类型尚未确定,程序员不可以使用类属类来直接创建对象实例,即一个类属类还不能认为是一种真正的类类型。必须先

类属类———(实例化)———具体的类-----(实例化)----具体的对象

可分为:

无约束类属类

– 类属类实例化的实际类属参数可以是任何类型。无约 束类属类的实际参数的类型并不要求具有共同的祖先 类,类属类中的操作与类属参数之间基本没有关联。

有约束类属类

– 类属类要求类属参数必须具有某些特殊的性质,以使 得类属类中可应用某些特殊操作,这种类属类称为受 约束类属类。例如:设计一个类属队列Queue中,希望 类属参数只能是Teacher,Worker或Student等类型, 就可通过增加约束,要求所有实际参数必须是人员类 Person的派生类。

使用模板机制实现的类属类是无约束类属类, 模板机制无法支持受约束类属类。C++语言的 受约束类属类必须采用继承与动态绑定实现, 多态数据结构即是一种受约束类属类。

--类属类的定义形式

template

class 类名字 { …… };

其中,用尖括号括起来的是形式类属参数表,它列 出了类属类的每个形式类属参数,多个形式类属参数之间 用逗号分隔开。每一个类属参数由保留字class引入。

类属类的声明与定义必须在同一个文件中,具体可参见前面的为什么类模版的声明和实现不能分开

类属类实例化的一般形式: 类属类名字<实际类属参数表> 对象实例名; CList d2(15); CList d3(15); CList d3(15);

类属类的继承和派生

类属类的派生与普通类的派生一样,也分为公有派生类、受保护派生类和私有派生类三种, 继承成员的访问控制规则也是相同的。一个类 属类可以作为一个普通类的派生类,类属类也 可作为其他类属类的基类。

普通类派生出类属类

• 普通类为基类,生成派生类时引入了形式化类 型参数,故派生类成为了类属类。

class Base{  //普通类为基类
...
..}


template<class TYPE> 
class Derived: public Base //Derived 为类属类{
...
...}

主函数里实例化时:Base base(15,20);Derived d1(15,20,325);

类属类派生出类属类的例子

• 基类是类属类,生成派生类时可以加入形 式化类型参数,也可能未加入形式化类型 参数。在派生类属类实例化时,注意为基 类参数传递实际类属参数。

template<class T> class List  {   //基类为类属类
......}


template<class T> class Set: public List<T> {  //派生类也是类属类
...
...}

类属类派生出普通类的例子

• 基类是类属类,而生成派生类时,对基类指定了实际类型参数,所以,所形成的派生 类变成了非类属类(普通类)

template<class T> 
class List  {  //基类是类属类
...
...}

class Set: public List<int> { //派生类是普通类
...
...}

原文链接: https://www.cnblogs.com/Yogurshine/archive/2013/01/11/2856686.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/75199

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午4:52
下一篇 2023年2月9日 下午4:52

相关推荐