C++ 通过指针实现多态实例详解

C++ 通过指针实现多态实例详解

多态是面向对象编程语言的一个重要特性。在 C++ 中,实现多态的方法有虚函数和虚函数表、函数指针和指针数组、以及指针和引用等。其中,通过指针实现多态是一种常用的方式。在本篇文章中,我们将详细讲解如何通过指针实现多态。

什么是多态

多态是指不同的对象以不同的方式响应相同的消息的能力,这意味着不同的对象可以接受相同的消息,但是却可以表现出不同的行为。例如,在一个图形类中,不同的子类可以有不同的绘制方法,但是它们都可以接收“绘制”这个消息。

如何通过指针实现多态

在 C++ 中,通过指针实现多态的方法是将子类对象的指针赋值给父类对象的指针,并使用虚函数来调用方法。因为虚函数可以通过指针调用子类的方法,所以这样可以保证正确地调用不同子类的方法。

以下是通过指针实现多态的详细步骤:

  1. 定义基类和子类的结构体,并在基类中定义虚函数。
class Shape {
public:
    virtual void draw() { // 定义虚函数,使用 virtual 关键字
        std::cout << "This is a shape." << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() { // 重写虚函数
        std::cout << "This is a circle." << std::endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() { // 重写虚函数
        std::cout << "This is a rectangle." << std::endl;
    }
};
  1. 在 main 函数中使用基类指针指向不同的子类对象。
int main() {
    Shape* shapes[2]; // 定义基类指针的数组
    Circle circle;
    Rectangle rectangle;
    shapes[0] = &circle; // 将子类对象的指针赋值给父类对象的指针
    shapes[1] = &rectangle;
    for (int i = 0; i < 2; ++i) {
        shapes[i]->draw(); // 调用虚函数
    }
    return 0;
}
  1. 编译运行程序,输出结果为:
This is a circle.
This is a rectangle.

这说明成功地实现了通过指针实现多态。

示例说明

示例 1

在这个示例中,我们通过指针实现了动物类和其两个子类,马和狗。每个子类都有一个不同的叫声函数。我们通过指针数组,将不同的子类对象指针赋值给基类对象指针,然后调用虚函数,从而实现了多态。

#include <iostream>

class Animal {
public:
    virtual void makeSound() { // 定义虚函数
        std::cout << "This is an animal." << std::endl;
    }
};

class Horse : public Animal {
public:
    void makeSound() { // 重写虚函数
        std::cout << "This is a horse. Neigh!" << std::endl;
    }
};

class Dog : public Animal {
public:
    void makeSound() { // 重写虚函数
        std::cout << "This is a dog. Woof!" << std::endl;
    }
};

int main() {
    Animal* animals[2]; // 定义基类指针的数组
    Horse horse;
    Dog dog;
    animals[0] = &horse; // 将子类对象的指针赋值给父类对象的指针
    animals[1] = &dog;
    for (int i = 0; i < 2; ++i) {
        animals[i]->makeSound(); // 调用虚函数
    }
    return 0;
}

运行程序,输出结果为:

This is a horse. Neigh!
This is a dog. Woof!

示例 2

在这个示例中,我们通过指针实现了图形类和其两个子类,圆形和矩形。每个子类都有一个不同的绘制函数。我们通过指针数组,将不同的子类对象指针赋值给基类对象指针,然后调用虚函数,从而实现了多态。

#include <iostream>

class Shape {
public:
    virtual void draw() { // 定义虚函数
        std::cout << "This is a shape." << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() { // 重写虚函数
        std::cout << "This is a circle." << std::endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() { // 重写虚函数
        std::cout << "This is a rectangle." << std::endl;
    }
};

int main() {
    Shape* shapes[2]; // 定义基类指针的数组
    Circle circle;
    Rectangle rectangle;
    shapes[0] = &circle; // 将子类对象的指针赋值给父类对象的指针
    shapes[1] = &rectangle;
    for (int i = 0; i < 2; ++i) {
        shapes[i]->draw(); // 调用虚函数
    }
    return 0;
}

运行程序,输出结果为:

This is a circle.
This is a rectangle.

结论

通过指针实现多态是 C++ 中一种常用的实现多态的方式。它让不同的子类对象以不同的方式响应相同的消息,从而实现了多态。在使用中要注意虚函数的定义和指针的使用,才能保证程序的正确性和可读性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 通过指针实现多态实例详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • QT中出现“无法解析的外部符号”错误

    在QT中出现“无法解析的外部符号”错误通常是由于编译器无法找到所需的函数或变量定义,或者链接器无法找到所需的库文件。在本文中,我们将详细介绍解决这种错误的完整攻略,并提供两个示例说明。 解决“无法解析的外部符号”错误的攻略 1. 检查头文件和源文件 首先,我们需要检查头文件和源文件是否正确包含所需的函数或变量定义。如果头文件或源文件中缺少所需的定义,编译器将…

    other 2023年5月5日
    00
  • mysql语句自增语句咋写

    以下是“MySQL语句自增语句咋写”的完整攻略: MySQL语句自增语句咋写 在MySQL中,可以使用自增语句来为表中的记录生成唯一标识符。本攻略将介绍如何在MySQL中编写自增语句。 步骤1:创建表 首先,您需要创建一个表来存储数据。以下是一个示例: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KE…

    other 2023年5月7日
    00
  • [下载]安卓6.0/Android M第三个开发者预览版固件下载地址

    下载安卓6.0/Android M第三个开发者预览版固件下载地址 安卓6.0/Android M第三个开发者预览版现已推出,下载地址如下: 步骤1:为您的设备下载正确的固件 请确保您下载的固件与您的设备和型号相匹配,以避免因下载错误的固件导致问题。 示例说明1:如果您的设备是Nexus 6,那么您应该下载“shamu”的固件。 示例说明2:如果您的设备是Ne…

    other 2023年6月26日
    00
  • 详解Linux中的wget命令

    下面我来为你详细讲解“详解Linux中的wget命令”的攻略。 详解Linux中的wget命令 什么是wget命令 wget(又称网景蜘蛛,是英文”Web Get”的缩写)是一个在Linux和Unix系统中下载文件的命令行工具。使用wget可以从网络上下载文件、网页、图片等。 在Linux系统中,Wget也可以使用http、https、ftp等协议下载资源。…

    other 2023年6月26日
    00
  • 关于docker和docker-ce之间的区别

    Docker和Docker-CE的区别 Docker是一种容器化技术,可以将应用程序及其依赖项打包到一个可移植容器中,以便在不同的环境中运行。Docker-CE(Community Edition是Docker的社区版,是免费的开软件。本攻略将详细介绍Docker和Docker-CE之间的区别。 Docker和Docker-CE的区别 Docker和Dock…

    other 2023年5月7日
    00
  • Android自定义弹出框dialog效果

    Android自定义弹出框dialog效果攻略 在Android开发中,我们经常需要使用自定义弹出框(dialog)来展示特定的信息或者与用户进行交互。下面是一个完整的攻略,帮助你实现Android自定义弹出框的效果。 步骤一:创建自定义布局 首先,我们需要创建一个自定义的布局文件来定义弹出框的外观和内容。可以使用XML文件来描述布局,例如custom_di…

    other 2023年8月20日
    00
  • VB6.0怎么使用文件对话框控件?

    当你需要让用户选择文件(如打开或保存文件),文件对话框控件是一个非常有用的工具。在VB6.0中,你可以通过以下步骤使用文件对话框控件: 步骤1:添加文件对话框控件 将文件对话框控件添加到你的窗体控件中。这可以通过在窗体设计器中拖动和放置文件对话框控件或直接编写代码实现。以下是一个在窗体1中添加文件对话框控件的示例代码: Private OpenFileDia…

    other 2023年6月27日
    00
  • JAVA 多态操作—-父类与子类转换问题实例分析

    JAVA 多态操作—-父类与子类转换问题实例分析 简介 多态是面向对象编程中的一个重要概念,能够提高代码的可扩展性、可维护性和可复用性。在多态中,一个父类可以有多个子类,同样,一个对象也可以在不同的情况下具有不同的形态。在本篇文章中将介绍在JAVA中实现多态时,父类与子类的转换问题,并通过两个实例进行说明。 父类与子类的转换 在JAVA中,父类与子类之间…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部