- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * (2)一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的且与该函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。在什么情况下把一个成员函数声明为虚函数呢? (1)首先看成员函数所在的类是否会作为基类;然后看成员函数在类的继承后有无可能被更改功能,如果希望更改,则声明为虚函数 (2)如果成员函数在类被继承后不需修改,或 * * 派生类用不到该函数,则不要把它声明为虚函数。 (3)应考虑对成员函数的调用是通过对象名还是通过基类指针或引用去访问,如果是通过基类指针或引用去访问的,则应当声明为虚函数。 (4)有时,在定义虚函数时,并不定义其函数体,即函数体是空的。它的作用只是定义一个虚函数名,具体功能留给派生类去添加。详见6.4节。 * * 6.3.4 虚析构函数前面已讲,当派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后再调用基类的析构函数。例6.3 派生类对象析构函数时的执行情况。见C6-3-1.CPP (系统会只执行基类的析构函数,而不执行派生类的析构函数。) * * #include iostream using namespace std; class Point { public:Point( ){ }~Point( ){ coutexecuting Pointdestructorendl; } }; class Circle : public Point { public:Circle( ){ } * *~ Circle( ){ coutexecuting Circledestructorendl; } private:int radius; }; int main( ) { Point *p = new Circle; delete p; return 0;} * * 运行结果为:executing Point destructor (执行点的析构函数) 即只执行了基类Point的析构函数,而没有执行派生类Circle的析构函数。解决办法是:将基类的析构函数声明为虚析构函数,即修改为(见C3-6-2.CPP): virtual ~Point( ){ coutexecuting Pointdestructorendl; } * *这样,当基类的析构函数为虚函数时,无论指针指的是同一类族中的哪一个对象,当对象撤销时,系统会采用动态关联,调用相应的析构函数,对该对象进行不理工作。如果将基类的析构函数声明为虚函数,由该基类所派生的所有派生类的析构函数也都自动成为虚函数(即使派生类的析构函数与基类的析构函数名字不相同)。程序中最好把基类的析构函数声明为虚函数,这将使所有派生类的析构函数自动成为虚函数。 * * 6.4 纯虚函数与抽象类 6.4.1 纯虚函数纯虚函数:就是在声明虚函数时被“初始化”为0的函数。 声明纯虚函数的一般格式为:virtual 函数类型 函数名(参数表列) =0 如将前面例题中求点的面积的area函数可以定义为纯虚函数,即:virtual float area( ) const=0; 说明:(1)纯虚函数没有函数体; * * (2)最后面的“=0”只起形式上的作用,表明这是纯虚函数,并不表示函数返回值为0; (3)这是一个声明语句,最后有分号“;” (4)纯虚函数只有函数的名字而不具备函数的功能,因此不能被调用。在派生类中对此函数提供定义后,它才具备函数的功能,可以被调用。 (5)纯虚函数的作用:是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义,从而实现动态多态性。 * * (6)如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该函数在派生类中仍然为纯虚函数。 6.4.2 抽象类在面向对象程序设计中,往往有一些类,它们不是用来生成对象,定义这些类的惟一目的是用它作为基类去建立派生类。这种不用来定义对象而只作为一种基本类型用作继承的类,称为抽象类。由于它常用作基类,通常称为抽象基类。 * *凡是包含纯虚函数的类都是抽象类。因为纯虚函数是不能被调用的,包含纯虚函数的类是无法建立对象的。抽象类的作用是作为一个类族的共同基类,或者说,为一个类族提供一个公共接口。如果在派生类中没有对所有纯虚函数进行定义,则此派生类仍然是抽象类,不能用来定义对象。虽然抽象类不能定义对象,但是可以定义指向抽象类数据的指针变量。当派生类成 * * 为具体类之后,就可以用这种指针指向派生类对象,然后通过该指针调用虚函数,实现多态性的操作。 6.4.3 应用实例 (参见补充的两个例子:C6_虚函数补充例子1.cppC6_虚函数补充例子2.cpp ) * * 例6.4 虚函数和抽象基类的应用本例是
原创力文档


文档评论(0)