- 24
- 0
- 约1.33万字
- 约 17页
- 2016-10-22 发布于河南
- 举报
010多态模板
多态
一、什么是多态
不同对象接收到相同的消息时,产生不同的结果。
二、多态的分类
有通用多态(参数多态,包含多态)和专用多态(重载多态,强制多态)。
参数多态:模板;包含多态:虚函数;重载多态:函数及运算符重载;强制多态:强制类型转换。
三、多态的实现
编译时的多态(重载实现。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。直到系统运行时,才根据实际情况决定实现何种操作。编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。“iostream.h”
class base
{
public:
void show()
{cout”基类的内容\n”;}
};
class sub:public base
{
public:
void show()
{cout”子类的内容\n”;}
};
main()
{
base a,*p;
sub b,*j;
p=a;
j=a;
p-show();
p=b;
p-show();//((sub *)p)-show();可显示子类内容
}
通过指针引起的普通函数调用,仅与指针(或引用)的类型有关,而与此时指针正指向的对象无关。
一个指向基类的指针可用来指向从基类公有派生的任何的对象,它是C++实现运行时多态的关键途径。
2.为了使用对象指针表达动态性质,引入虚函数
虚函数是为了实现多态,也就是要用基类指针调用派生类的方法虚函数常常出现在一些抽象接口类定义里“iostream.h”
class base
{
public:
virtual void show()
{cout”基类的内容\n”;}
};
class sub:public base
{
public:
void show()
{cout”子类的内容\n”;}
};
main()
{
base a,*pc;
sub b;
pc=a;
pc-show();
pc=b;
pc-show();//随指针移动,动态实现了单界面,多实现版本
}
3.虚析构函数
一个类拥有虚析构函数表明它是一个基类。用虚析构函数是为了解决当用基类的指针指向派生类时,如果删除此指针,要调用派生类的析构函数(虚函数的作用)。如:
base* p=new sub();
delete p;//调用派生类的析构函数
有时,一个类想跟踪它有多少个对象存在。一个简单的方法是创建一个静态类成员来统计对象的个数。这个成员被初始化为0,在构造函数里加1,析构函数里减1。设想在一个军事应用程序里,有一个表示敌人目标的类:class enemytarget
{
public:
enemytarget(){ ++numtargets; }
~enemytarget(){ --numtargets; }
static int numoftargets() { return numtargets; }
private:
static int numtargets;
};
敌人的坦克是一种特殊的敌人目标,所以会很自然地想到将它抽象为一个以公有继承方式从enemytarget派生出来的类class enemytank: public enemytarget
{
public:
enemytank() { ++numtanks; }
~enemytank() { --numtanks; }
static int numoftanks(){ return numtanks; }
private:
static int numtanks;
};
但这段代码当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。”现在敌军坦克数量是:”enemytank::numoftanks()endl;
delete p;
p=NULL;
cout”现在敌军坦克数量是:”enemytank::numoftanks()endl;
return 0;
}
但一个类中如果不包含虚函数,则说明该类一般不做基类,则无必要定义虚析构函数。因为虚函数会产生一个指向虚函数表函数指针,使程序点用额外的空间。
五、纯虚函数和抽象类
1.纯虚函数是一个在基类中说明的虚函数,它在基类中没有定义,但要在子类中进行定义。
格式:
virtual 函
原创力文档

文档评论(0)