- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第23讲(抽象类和虚析构函数)
第23讲
教学内容
8.4 抽象类
8.4.1纯虚函数
8.4.2 抽象类
教学重点和难点
1纯虚函数的定义方式,作用
2虚析构函数的理解和使用
3 抽象类的使用场合
教学方法:
通过程序举例演示,讲解纯虚函数的定义方式,作用,虚析构函数和抽象类的使用场合
教学学时
2 学时
教学过程
一 虚析构函数 :
1用多态性处理类层次中动态分配的对象时存在一个问题:
如果delete运算符用于指向派生类对象的基类指针,但程序中又显式的用该运算符删除每一个对象,那么c++标准会指出这一行为没有定义。这个问题有个简单的解决办法:声明基类析构函数为虚函数,这样,即使所有派生类析构函数不与基类析构函数同名,也可以使这些析构函数为虚函数。现在,如果对基类指针用delete运算符隐式删除了类层次中的某个对象,那么可以基于基类指针所指的对象调用相应的类的析构函数。记住:删除某个派生类后,派生类的基类部分也会被删除,基类析构函数在派生类析构函数之后自动执行。
2 何时需要虚析构函数?
当你可能通过基类指针删除派生类对象时(通过delete),
程序举例:观察下列程序的输出结果
#include iostream
using namespace std;
class People
{
protected:
char m_name[20];
public:
People(char name[20])
{
strcpy(m_name,name);
cout 调用People的构造函数endl;
}
virtual ~People()
{
cout 调用People的析构函数endl;
}
};
class Student:public People
{
private:
int m_ID;
public:
Student(char name[20],int ID):People(name)
{
m_ID = ID;
cout 调用Student的构造函数endl;
}
~Student()
{
cout 调用Student的析构函数endl;
}
};
void main(void)
{
/*People p(小李);
Student s(小王;
//此时会调用父类和自己本身的构造函数和析构函数,不受virtual的影响*/
People *pp;
pp = new Student(小王;
delete pp;
//当你可能通过基类指针删除派生类对象时(通过delete)
二抽象类:
1作用
–抽象类为抽象和设计的目的而声明,将有关的数据和行为组织在个继承层次结构中,保证派生类具有要求的行为。
–对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。
2注意
–抽象类只能作为基类来使用。
–不能声明抽象类的对象。
–构造函数不能是虚函数,析构函数可以是虚函数。
3 概念:
带有纯虚函数的类称为抽象类:,抽象类包含一个或者多个
class 类名
{
virtual 类型 函数名(参数表)=0; //纯虚函数
…
}
程序举例:
课后习题8-9 请编写抽象类Shape,在此基础上派生出Circle和Rectangle类,两者都有计算对象面积的函数GetArea()和计算周长的函数GetPerim(),从Rectanglelel类派生出Square类
#include iostream
using namespace std;
#include iostream
using namespace std;
class Shape//带有纯虚函数的类叫抽象类
{
public:
virtual double GetArea() = 0;//纯虚函数,也就是没有函数体{}
virtual double GetPerim() = 0;
virtual char * GetName() = 0;
};
class Circle:public Shape
{
private:
int radius;
public:
Circle() { }
Circle(int r):radius(r)
{
}
virtual double GetArea()
{
return 3.14 * radius * radius;
}
virtual do
文档评论(0)