您好,欢迎访问三七文档
Version3.0多态第九章2回顾•继承•访问控制•继承中的构造函数和析构函数•函数覆盖3目标•虚函数•纯虚函数•抽象类•动态绑定•虚析构函数4虚函数•基类的指针可以指向派生类的对象•但调用的函数却是基类的函数•虚函数可以解决这个问题5示例2-1#includeiostream.hclassShapes{public:voiddraw()//基类中的函数{cout绘制基本形状\n;}};classCircle:publicShapes{private:intradius;public:voiddraw()//在派生类中重新定义{cout绘制圆形\n;}};6示例2-2classSquare:publicShapes{private:intlength;public:voiddraw()//在派生类中重新定义{cout绘制正方形\n;}};voidmain(){Circlec;Squares;Shapes*ptr;ptr=&c;ptr-draw();ptr=&s;ptr-draw();}调用Shapes的draw()方法7虚函数的定义•希望使用draw()函数绘制不同对象•draw()函数必须在基类中被声明为虚函数virtualvoiddraw()//基类中的虚函数{cout绘制基本形状\n;}8虚函数的覆盖•派生类替换基类提供的虚函数实现•编译器确保调用函数的正确版本9演示使用虚函数演示前面的例子10注意要点•virtual关键字•虚函数必须在声明它的类中有定义•在派生类中重新定义的虚函数必须具有相同的参数11纯虚函数2-1•基类无法(或没有必要)提供虚函数的实现•将虚函数声明为纯虚函数virtualvoidprint()=0;12纯虚函数2-2•派生类要创建对象,必须实现纯虚函数•不能创建含有纯虚函数的类的对象13抽象类2-1•包含纯虚函数的类•只能用作基类•不能创建抽象类的对象class类名{virtual类型函数名(参数表)=0;};14抽象类2-2•继承了抽象类而没有提供纯虚函数的实现,这个类也是抽象类–抽象类提供接口而不暴露实现细节–在许多商业用途的库和应用程序框架中使用15动态绑定2-1•成员函数调用中代码地址的确定–非虚成员函数是根据指向对象的指针的类型静态地(在编译时)选择–虚成员函数是动态(在运行时)解析的。根据对象的类型而不是根据指向对象的指针的类型来动态地(在运行时)选择16动态绑定2-2•使用虚函数,系统将使用动态绑定•在程序设计中提供更强的功能和灵活性•处理过程中占用一些开销17虚析构函数2-1•调用析构函数是为了释放由构造函数分配的内存空间•如果基类的析构函数是非虚的,则不能用指向派生类的指针调用派生类的析构函数•需要虚析构函数18虚析构函数2-2•虚函数绑定到与对象所属的类,而不是与指针所对应的类•派生类的实例总是包含一个基类的实例•需要调用这两个类的析构函数以确保所有空间都被释放•注意:构造函数不能是虚函数19示例2-1#includeiostream.hclassAlpha{private:char*alpha_ptr;public:Alpha()//构造函数不能是虚函数{alpha_ptr=newchar[5];}virtual~Alpha()//虚析构函数{delete[]alpha_ptr;coutAlpha的析构函数endl;}};20示例2-2classBeta:publicAlpha{private:char*ptrderived;public:Beta(){ptrderived=newchar[100];}~Beta(){delete[]ptrderived;coutBeta的析构函数endl;}};voidmain(){Alpha*ptr=newBeta;deleteptr;}21总结•虚函数•纯虚函数•抽象类•动态绑定•虚析构函数
本文标题:C++多态
链接地址:https://www.777doc.com/doc-3357972 .html