第4章多态教材.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
-*- 多态的补充说明 应该将析构函数声明为虚函数,如果希望所写的类被继承并多态执行。 不声明虚析构函数情况下,基类指针指向堆中创建的子类对象,执行delete操作时,将会产生内存泄漏 声明虚析构函数情况,执行delete时,由于多态效果,调用子类的析构函数,从而引起基类析构函数调用。 构造函数不能声明为虚函数。 使用虚函数实现多态增强了程序的灵活性,但由于维护虚函数表,会带来运行时的开销。 -*- 本章内容安排 多态的概念 虚函数实现多态 虚函数机制 纯虚函数与抽象类 -*- Shape类 class Shape { public: Shape() {} virtual ~Shape() {} virtual double getArea() { return -1; } virtual double getPerim() { return -1; } }; 形状类是其它具体形状类型的基类,计算面积、周长 和绘图功能对shape类实际上没有多大的意义。 -*- Circle类 const double PI=3.14; class Circle : public Shape { public: Circle(double newRadius) : radius( newRadius ) {} virtual ~Circle() {} virtual double getArea() { return PI * radius * radius; } virtual double getPerim() { return 2 * PI * radius; } private: double radius; }; Circle类重写了基类的2个虚函数。 -*- Rectangle类 class Rectangle : public Shape { public: Rectangle(double newLen, double newWidth) :length(newLen), width(newWidth) {} virtual ~Rectangle() {} virtual double getArea() { return length * width; } virtual double getPerim() { return 2 * length + 2 * width; } virtual double getLength() const { return length; } virtual double getWidth() const { return width; } private: double width; double length; }; Rectangle类重写了基类的2个虚函数 -*- 将Shape声明为抽象数据类型 Shape是各种形状的基类,但定义Shape类对象并没有意义,Shape更应该作为一种抽象概念。 将Shape类中的虚函数定义为纯虚函数,表明Shape是一种抽象概念(抽象类)。 纯虚函数只需要给出声明,通常情况下不给出纯虚函数的定义(函数体) C++禁止定义抽象类对象; 抽象类基础上派生的类,应该重写基类的纯虚函数,若没有重写,该类仍然是抽象类。 -*- 抽象Shape类 class Shape { public: Shape() {} virtual ~Shape() {} virtual double getArea() = 0; virtual double getPerim() = 0; }; Shape类是抽象类,不允许实例化。Shape类的子类必须 重写Shape类的纯虚函数后才能实例化。 抽象类给出所有子类应该遵循的抽象接口,通常不在 抽象类中定义数据成员。 * -*- 本章内容安排 多态的概念 虚函数实现多态 虚函数机制 纯虚函数与抽象类 -*- 赋值兼容性规则 每一个派生类的对象,都是基类的一个对象。赋值兼容规则是指在公有派生情况下,一个公有派生类的对象可以当作基类的对象使用,反之则禁止。 派生类的对象可以赋值给基类对象。 派生类的对象可以初始化基类的引用。 指向基类的指针也可以指向派生类。 通过基类对象名、指针只能使用从基类继承的成员 -*- 派生类对象赋值给基类对象 Mammal m(3,5); Dog d(2,3,LAB); m=d; 通过m不能访问或间接访问breed成员 m age weight 2 2 3 d 2 age weight 3 L

文档评论(0)

阿里山的姑娘 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档