- 1、本文档共37页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 3.3.4 虚析构函数 不能声明虚构造函数,因为在构造函数执行时,对象还没有完全构造好,不能按虚函数方式进行调用。 可声明虚析构函数,如果用基类指针指向一个new生成的派生类对象,通过delete作用于基类指针删除派生类对象时,有以下两种情况: (1)基类析构函数不为虚析构函数,会调用基类的析构函数,派生类的析构函数不会被调用,派生类对象中派生的那部分内存空间无法析构释放。 (2)如果基类析构函数为虚析构函数,释放基类指针的时候会调用基类和派生类中的所有析构函数,派生类对象中所有的内存空间都将被释放,包括继承基类的部分。 所以C++中的析构函数通常是虚析构函数。 * 3.3.4 虚析构函数 【例3.12】虚析构函数的用法和作用示例。 #include iostream.h class Base1 { public: ~Base1() { cout ~Base1()\n; } }; class Derived1 : public Base1 { public: ~Derived1() { cout ~Derived1()\n; } }; class Base2 { public: virtual ~Base2() { cout ~Base2()\n; } }; * * class Derived2 : public Base2 { public: ~Derived2() { cout ~Derived2()\n; } }; void main() { Base1* bp = new Derived1; delete bp; Base2* b2p = new Derived2; delete b2p; } 运行结果: ~Base1() ~Derived2() ~Base2() * 3.4 纯虚函数和抽象类 在许多情况下,在基类中不能给出有意义的虚函数定义, 可以在基类person中加一个displaySalary函数,并声明为虚函数: virtual void displaySalary (int m,int s ) { return 0; } virtual void displaySalary (int m,int s ) =0; 这就将void displaySalary (int m,int s )声明为一个纯虚函数(pure virtual function),把它的具体定义留给派生类来做。 纯虚函数 在C++中,对于那些在基类中不需要定义具体的行为的函数,可以定义为纯虚函数。 声明纯虚函数的一般形式是 class 类名 { virtual 类型 函数名(参数表)=0; //纯虚函数 ... }; 如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数。 * * 3.4.2 抽象类 如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。 抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类中的纯虚函数可能是在抽象类中定义的,也可能是从它的抽象基类中继承下来且重定义的。 抽象类有一个重要特点,即抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。 可使用指向抽象类的指针支持运行时多态性。 抽象类定义的一般形式是: class 类名 { public: virtual 返回值类型 函数名(参数表) = 0; 其他函数的声明; ……. }; 【例3.13】抽象基类示例。 * * 【例3.13】抽象基类示例。 #include iostream.h class Person { public: virtual void PrintInfo() {coutPerson\n; } virtual void DisplaySalary(int m,double s)=0; }; class Worker: public Person { private: int kindofwork; public: void PrintInfo () {coutWorker\n;} void DisplaySalary(int m,double s) {cout工人全年的工资是:m*sendl;} }; * * class Teacher: public Person { private: int subject; public: void PrintInfo () {coutTeacher\n
文档评论(0)