1,首先考虑一个问题:
型别T会影响class的行为吗?
如果不影响,你可以使用template.
如果影响,你必须使用虚拟函数,并因而使用继承机制.
2,来看一个模版的实例:
#include <iostream>
using namespace std;
template<class T>
class Stack
{
public:
Stack();
void push(const T& t);
T& pop();
T& top();
bool empty();
int size();
~Stack();
private:
struct StackNode
{
StackNode(const T& t, StackNode *nextNode) : data(t),next(nextNode){}
T data;
StackNode* next;
};
StackNode* head;
int cnt;
Stack(const Stack&);
Stack& operator=(const Stack&);
};
template<class T>
Stack<T>::Stack() : head(NULL),cnt(0) {}
template<class T>
void Stack<T>::push(const T& t)
{
head = new StackNode(t, head);
cnt++;
}
template<class T>
T& Stack<T>::pop()
{
if (!empty())
{
StackNode* tmp = head;
head = head -> next;
T tmpData = tmp -> data;
delete tmp;
cnt--;
return tmpData;
}
}
template<class T>
T& Stack<T>::top()
{
if (!empty())
return head -> data;
}
template<class T>
bool Stack<T>::empty()
{
return head == NULL;
}
template<class T>
int Stack<T>::size()
{
return cnt;
}
template<class T>
Stack<T>::~Stack()
{
while (head)
{
StackNode* tmp = head;
head = head -> next;
delete tmp;
}
}
int main()
{
Stack<int> myStack;
myStack.push(20);
myStack.push(30);
myStack.push(40);
cout << myStack.pop() <<endl;
cout << myStack.size() <<endl;
cout << myStack.top() <<endl;
return 0;
}
3,总结:
template用来产生一群class,其中对象型别不会影响class的函数行为.
inheritance用于一群class身上,其中对象型别会影响class的函数行为.
分享到:
相关推荐
条款41:了解隐式接口和编译期多态 understand implicit interfaces and compile-time polymorphism. 条款42:了解typename的双重意义 understand the two meanings of typename. 条款43:学习处理模板化基类内的...
操作系统之死锁处理算法
条款34:区分接口继承和实现继承 条款35:考虚virtual函数以外的其他选择 条款36:绝不重新定义继承而来的non-virtual函数 条款37:绝不重新定义继承而来的缺省参数值 条款38:通过复合塑模出has-a或“根据某物...
5. **8.5 Constructors and Destructors Under Inheritance** - 在继承中,派生类可以调用基类的构造函数和析构函数,以确保正确初始化和清理资源。 6. **8.6 Name Hiding** - 名称隐藏意味着派生类可以重新定义...
- 公开继承(Public Inheritance):基类的公有成员和受保护成员在派生类中仍然是公有和受保护的。私有成员仍然仅在基类中可见。 - 私有继承(Private Inheritance):基类的公有和受保护成员在派生类中变为私有的,...
ActiveRecord Inheritance是为Yii2框架提供的实用程序。 其动机是在两个ActiveRecord类之间伪造继承。 安装 将程序包作为依赖项包含在bower.json文件下。 要安装,请运行 $ ...
"93317446inheritance"可能是一个源代码文件,根据命名习惯,可能是该项目的主要或核心实现文件,包含了遗传算法的具体逻辑和实现。 在C语言中实现遗传算法可能会涉及到以下知识点: 1. 结构体:由于C语言不直接...
在C++编程中,继承(Inheritance)是面向对象编程的一个核心概念,它允许我们创建新的类(派生类)时基于已经存在的类(基类)。这种机制使得基类的特性被派生类继承,从而实现代码重用并表达程序组件间的自然关系。...
在本课件“10_Inheritance.ppt”中,重点讲解了面向对象编程中的继承(Inheritance)这一关键知识点。继承是OOP的基石之一,它促进了软件的复用,使得代码更加模块化和高效。 继承的基本思想是,我们可以将一个类视...
面向对象程序设计(Object-Oriented Programming,OOP)是一种重要的编程范式,它通过类和对象的概念,以及封装、继承和多态等核心特性,实现了代码的复用和模块化。在本教学课件“10-Inheritance.pptx”中,主要...
Chapter 9: Class Inheritance and Virtual Functions Chapter 10: The Standard Template Library Chapter 11: Debugging Techniques Chapter 12: Windows Programming Concepts Chapter 13: Windows Programming...
用中国式思维理解面向对象,pdf格式,内容包含:目彔 Catelog序言 Perface真经第一章:世界 Waltanschauung真经第二章:抽象 Abstraction真经第三章:层次 Arrangement真经第四章:继承 Inheritance真经第亐章:...
继承是面向对象编程中的核心概念之一,它允许开发者从已有的类(父类或超类)派生出新的类(子类或派生类),以此来实现代码的复用和扩展。在Java编程语言中,继承通过关键字`extends`来实现。这种机制创建了“is-a...
Chapter 8: Introducing Inheritance Chapter 9: Using Templates Chapter 10: Using Streams and Files Chapter 11: Errors and Exception Chapter 12: Programming with Windows Chapter 13: Using DirectX ...
"inheritance---derived-class.rar_inheritance"这个压缩包文件显然包含了关于C++继承和派生类的详细教程。 继承的概念在于,子类可以自动获取基类的所有公共成员(包括数据成员和成员函数),并且可以添加新的成员...
JavaScript,作为一种广泛应用于Web开发的脚本语言,其高级特性如闭包(closures)、原型(prototype)和继承(inheritance)是理解其精髓的关键。本文将深入探讨这些概念,帮助开发者更好地掌握JavaScript的核心。 ...
10. **学习与实践**:"inheritance_art.zip"可能包含了具体的示例项目,帮助开发者通过实际操作理解继承的概念和应用。通过分析和修改这些示例,你可以加深对Godot中继承机制的理解,并提升游戏开发技能。 总之,...
为了提高内存管理和数据存储的效率,ACE提供了一套完整的容器和内存管理类: - `ACE_Array`、`ACE_Bounded_Set`等:各种类型的数据容器,用于存储和管理数据元素。 - `ACE_Allocator`、`ACE_Cached_Allocator`等:...