免费发布信息
微信公众号

C++ 多态是什么?C++ 多态一般是指什么?

   来源:黔优网责任编辑:优优  时间:2023-09-22 17:06:23 浏览量:38
导读:C++多态多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。下面的实例中,基类 Shape

C++ 多态

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。

C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

下面的实例中,基类 Shape 被派生为两个类,如下所示:

#include <iostream>  using namespace std;   class Shape {    protected:       int width, height;    public:       Shape( int a=0, int b=0)       {          width = a;          height = b;       }       int area()       {          cout << "Parent class area :" <<endl;          return 0;       } }; class Rectangle: public Shape{    public:       Rectangle( int a=0, int b=0):Shape(a, b) { }       int area ()       {           cout << "Rectangle class area :" <<endl;          return (width * height);        } }; class Triangle: public Shape{    public:       Triangle( int a=0, int b=0):Shape(a, b) { }       int area ()       {           cout << "Triangle class area :" <<endl;          return (width * height / 2);        } }; // 程序的主函数 int main( ) {    Shape *shape;    Rectangle rec(10,7);    Triangle  tri(10,5);    // 存储矩形的地址    shape = &rec;    // 调用矩形的求面积函数 area    shape->area();    // 存储三角形的地址    shape = &tri;    // 调用三角形的求面积函数 area    shape->area();        return 0; }

当上面的代码被编译和执行时,它会产生下列结果:

Parent class area : Parent class area :

导致错误输出的原因是,调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。

但现在,让我们对程序稍作修改,在 Shape 类中,area() 的声明前放置关键字 virtual,如下所示:

class Shape {    protected:       int width, height;    public:       Shape( int a=0, int b=0)       {          width = a;          height = b;       }       virtual int area()       {          cout << "Parent class area :" <<endl;          return 0;       } };

修改后,当编译和执行前面的实例代码时,它会产生以下结果:

Rectangle class area Triangle class area

此时,编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。

正如您所看到的,每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。

虚函数

虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。

我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定

纯虚函数

您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。

我们可以把基类中的虚函数 area() 改写如下:

class Shape {    protected:       int width, height;    public:       Shape( int a=0, int b=0)       {          width = a;          height = b;       }       // pure virtual function       virtual int area() = 0; };

= 0 告诉编译器,函数没有主体,上面的虚函数是纯虚函数

 
 
 
没用 0举报 收藏 0
免责声明:
黔优网以上展示内容来源于用户自主上传、合作媒体、企业机构或网络收集整理,版权争议与本站无关,文章涉及见解与观点不代表黔优网官方立场,请读者仅做参考。本文标题:C++ 多态是什么?C++ 多态一般是指什么?,本文链接:https://www.qianu.com/news/251564.html,欢迎转载,转载时请说明出处。若您认为本文侵犯了您的版权信息,或您发现该内容有任何违法信息,请您立即点此【投诉举报】并提供有效线索,也可以通过邮件(邮箱号:kefu@qianu.com)联系我们及时修正或删除。
 
 

 

 
推荐图文
推荐商业资讯