多态(C++语言实现)

简介: 多态(C++语言实现)

C++中的多态是非常重要的一个概念。也是比较难理解的一个方面。***从字面意思理解,多态就是多种形态。***这也是非常常见的一种说法。

1.多态的引出

如下图所示,我们需要解决的问题就是计算几何图形的面积,然后定义了一个类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();
  printf("\t---%d---\n", shape->area());
  // 存储三角形的地址
  shape = &tri;
  // 调用三角形的求面积函数 area
  //shape->area();
  printf("\t---%d---\n", shape->area());
  system("pause");
  return 0;
}

然而我们执行代码之后出现了如下的结果:

这是因为我们子类继承了父类的各种属性和方法,而在父类中area方法的返回值是0,因为调用函数 area() 被编译器设置为父类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定

2.虚函数

要实现我们理想的状态,就需要用到虚函数,也就是在父类的area方法前面加上virtual关键字,代码如下:

#include <iostream> 
using namespace std;
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;
  }
};
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();
  printf("\t---%d---\n", shape->area());
  // 存储三角形的地址
  shape = &tri;
  // 调用三角形的求面积函数 area
  //shape->area();
  printf("\t---%d---\n", shape->area());
  system("pause");
  return 0;
}

运行结果为:

这就是多态的一般使用方式。有了多态,大大方便了我们代码的扩展。这种操作被称为动态链接,或后期绑定

从这个例子就可以看出来,多态可以更加方便我们去根据不同的对象实现不同的方法,量体裁衣。

3.纯虚函数

从上面一个例子可以看出,父类的虚函数在每个子类中都做了实现,那就说明父类的虚函数并没有十分重要,那我们可不可以有一种更加简单的实现方式呢?

答案是有,就是纯虚函数。写法如下:

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

理解起来也十分方便,就是令其为零,但是这个时候父类就变成了抽象类,抽象类是不能实例化的,通常用于实现接口的定理。比方说:

int main()
{
  Shape shape(10,20);
  printf("宽度为:%d\n",shape.width);
  system("pause");
  return 0;
}

这个时候程序就会报错,提示:

4.拓展

从最基本的逻辑来说,如果父类定义了纯虚函数,如果子类不实现父类的纯虚函数,肯定是不行的。但是如果子类不实现父类的虚函数,情况又会如何呢?

答案是:会和我们的第一版代码一样,执行的时候返回0

-------------------------------------------------------------------------------------END------------------------------------------

相关文章
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
188 2
|
1月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
154 12
|
6月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
174 15
|
3月前
|
存储 人工智能 编译器
c++--多态
上一篇文章已经介绍了c++的继承,那么这篇文章将会介绍多态。看完多态的概念,你一定会感觉脑子雾蒙蒙的,那么我们先以举一个例子,来给这朦胧大致勾勒出一个画面,在此之前,先介绍一个名词虚函数,(要注意与虚拟继承区分)重定义: 重定义(隐藏)只要求函数名相同(但要符合重载的要求,其实两者实际上就是重载);重定义下:在这种情况下,如果通过父类指针或引用调用函数,会调用父类的函数而不是子类。重定义(或称为隐藏)发生的原因是因为函数名相同但参数列表不同,导致编译器无法确定调用哪一个版本的函数。
68 0
|
6月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
115 8
|
7月前
|
编译器 C++
c++中的多态
c++中的多态
|
6月前
|
存储 编译器 C++
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
845 0
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
196 0
|
10月前
|
存储 编译器 数据安全/隐私保护
【C++】多态
多态是面向对象编程中的重要特性,允许通过基类引用调用派生类的具体方法,实现代码的灵活性和扩展性。其核心机制包括虚函数、动态绑定及继承。通过声明虚函数并让派生类重写这些函数,可以在运行时决定具体调用哪个版本的方法。此外,多态还涉及虚函数表(vtable)的使用,其中存储了虚函数的指针,确保调用正确的实现。为了防止资源泄露,基类的析构函数应声明为虚函数。多态的底层实现涉及对象内部的虚函数表指针,指向特定于类的虚函数表,支持动态方法解析。
113 1
|
11月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
125 2
C++入门12——详解多态1