多态(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------------------------------------------

相关文章
|
29天前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
42 2
|
29天前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
45 0
|
6天前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
9 0
|
1月前
|
存储 编译器 C++
|
1月前
|
编译器 C++ 容器
C++语言的基本语法
想掌握一门编程语言,第一步就是需要熟悉基本的环境,然后就是最重要的语法知识。 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。 类 - 类可以定义为描述对象行为/状态的模板/蓝图。 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 完整关键字
45 2
|
2月前
|
存储 编译器 C++
【C++】深度解剖多态(下)
【C++】深度解剖多态(下)
42 1
【C++】深度解剖多态(下)
|
2月前
|
存储 编译器 C++
|
30天前
|
存储 编译器 C++
C++多态实现的原理:深入探索与实战应用
【8月更文挑战第21天】在C++的浩瀚宇宙中,多态性(Polymorphism)无疑是一颗璀璨的星辰,它赋予了程序高度的灵活性和可扩展性。多态允许我们通过基类指针或引用来调用派生类的成员函数,而具体调用哪个函数则取决于指针或引用所指向的对象的实际类型。本文将深入探讨C++多态实现的原理,并结合工作学习中的实际案例,分享其技术干货。
38 0
|
2月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
|
2月前
|
前端开发 编译器 程序员
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决