C++基础之this指针与另一种“多态”

C++基础之this指针与另一种“多态”

1. this指针是什么?

在C++中,this指针有一个特殊的用途,它指向当前对象的指针。我们通常使用this指针来访问当前对象的成员变量和成员函数。

class Person {
private:
    string name;
public:
    Person(string name) {
        this->name = name;
    }
    void sayName() {
        cout << "My name is " << this->name << endl;
    }
};

在上述代码中,我们可以看到,通过使用this->name我们可以访问当前对象的name成员变量并输出其值。

2. 另一种“多态”

我们都知道,C++中通过虚函数和继承可以实现多态,但实际上还存在另一种多态的实现方式。

考虑下面的代码片段:

class Parent {
public:
    void function1() {cout << "parent function1" << endl;}
    void function2() {cout << "parent function2" << endl;}
};

class Child : public Parent {
public:
    void function1() {cout << "child function1" << endl;}
    void function2(int x) {cout << "child function2" << endl;}
};

在上述代码中,Child类继承了Parent类,并重载了其中的两个函数function1function2。如果我们使用以下代码调用这两个函数:

Child child;
child.function1();
child.function2(1);

那么输出结果将是:

child function1
child function2

这是因为在对象中,函数调用的地址是在编译时确定的,而不是在运行时根据对象的类型确定。因此,即使我们创建了一个Child对象,在调用function1function2时也会调用Child类中的版本,并不会调用Parent类中对应的函数。

3. 示例说明

为了更好地理解上述概念,我们来看一下以下示例:

class Shape {
public:
    virtual void area() = 0;
};

class Rectangle : public Shape {
private:
    int width;
    int height;
public:
    Rectangle(int width, int height) {
        this->width = width;
        this->height = height;
    }
    void area() override {
        cout << "Rectangle area: " << width * height << endl;
    }
};

class Triangle : public Shape {
private:
    int base;
    int height;
public:
    Triangle(int base, int height) {
        this->base = base;
        this->height = height;
    }
    void area() override {
        cout << "Triangle area: " << base * height / 2 << endl;
    }
};

在上述代码中,我们定义了一个抽象基类Shape,并在其基础上派生了两个子类RectangleTriangle,并分别覆盖了其纯虚函数area。现在我们可以使用以下代码来计算这两个类的面积:

int main() {
    Shape *shape;
    Rectangle rect(3, 4);
    Triangle tri(3, 4);

    shape = &rect;
    shape->area();

    shape = &tri;
    shape->area();

    return 0;
}

在上面的代码中,我们创建了一个Shape类型的指针shape,并将其分别指向了RectangeTriangle对象。当我们调用shape->area()时,将会调用相应的子类内部实现,这就是另一种多态的实现方式。

另外,我们也可以使用dynamic_cast函数来进行类型转换,具体代码如下:

int main() {
    Shape *shape;
    Rectangle rect(3, 4);
    Triangle tri(3, 4);

    shape = &rect;
    Rectangle *rectShape = dynamic_cast<Rectangle *>(shape);
    rectShape->area();

    shape = &tri;
    Triangle *triShape = dynamic_cast<Triangle *>(shape);
    triShape->area();

    return 0;
}

在上述代码中,我们将shape指针分别转换成了RectangleTriangle类型,并分别调用了其area函数。需要注意的是,使用dynamic_cast进行类型转换时,如果转换失败将返回nullptr

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++基础之this指针与另一种“多态” - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

    虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析 虚函数的概念 虚函数是一个定义在基类中的函数,它具有在运行时确定所调用的具体方法的能力,而不是在编译时确定。虚函数可以通过在函数的声明前加上关键字virtual来声明。 在C++中,使用虚函数可以实现多态,能够让同名的函数在不同的对象上具有不同的行为,这是面向对象的一个基本概念。 纯虚函数的概念 纯…

    C 2023年5月22日
    00
  • Matlab R2019b 64位中文完美激活安装详细教程(附密钥+许可文件下载)

    Matlab R2019b 64位中文完美激活安装详细教程(附密钥+许可文件下载) 简介 本教程将会详细介绍Matlab R2019b 64位中文完美激活安装的步骤,并提供相应的密钥和许可文件下载。本教程适用于Windows操作系统。 步骤 下载安装文件 在官网下载Matlab R2019b 64位中文安装包(推荐从官方网站下载,可以确保文件的安全性),下载…

    C 2023年5月22日
    00
  • gdb调试命令的使用及总结

    GDB调试命令的使用及总结 简介 GDB是一个功能强大的调试工具,可以用于调试C程序等各种编程语言。 它可以帮助程序员查找程序崩溃、调查内存问题、跟踪函数调用等问题。 本文旨在提供一些GDB常用调试命令的示例及使用方法,以便于程序员快速定位程序的问题。 命令列表 下面是一些常用的GDB调试命令的列表。 常用命令 命令 描述 run 运行程序 break [f…

    C 2023年5月22日
    00
  • C语言实现员工工资管理系统

    C语言实现员工工资管理系统 介绍 本文将详细讲解如何用C语言实现一个员工工资管理系统。该系统将能够实现对员工信息的存储、修改、删除以及工资发放等基本功能。我们将分步骤地讲解整个系统的实现,供初学者参考。 准备工作 在开始实现之前,需要安装C语言的编译器,比如GCC。此外,需要在系统上安装适合的文本编辑器。在本文中,我们使用的是Visual Studio Co…

    C 2023年5月23日
    00
  • Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    下面是详细讲解: 1. 简介 NDK是Android开发中的一种工具,可以让开发者利用C/C++等语言来开发JNI(Java Native Interface)的代码,从而实现更高效的底层计算。 NDK本身是一个工具链,包括编译器(gcc/clang)和标准库等。在Android Studio中进行NDK开发,一般需要借助CMake和Gradle等工具进行项…

    C 2023年5月23日
    00
  • MySQL处理JSON常见函数的使用

    下面是关于MySQL处理JSON常见函数的使用的完整攻略。 JSON类型介绍 在MySQL 5.7版本之后,MySQL开始支持JSON类型。JSON类型是一种结构化的数据类型,是一种轻量级的数据交换格式,便于人类阅读和编写,也易于机器解析和生成。JSON类型的值可以存储在JSON列中,也可以作为普通列或表达式的值使用。 处理JSON型列时的常见函数 MySQ…

    C 2023年5月23日
    00
  • C语言实现井字棋游戏(人机对弈)

    C语言实现井字棋游戏(人机对弈)攻略 概述 井字棋,是一种简单的二人游戏,游戏过程中使用一个 3×3 的格子,两个人轮流在格子中放置自己的符号(通常是“x”和“o”),直到其中一方连成三个相同的符号为止。 本攻略旨在介绍如何使用 C 语言编写一个井字棋游戏,并实现人机对弈的功能。 游戏规则 游戏开始时,玩家和电脑各占一个符号(通常是“x”或“o”)。 游戏持…

    C 2023年5月23日
    00
  • 合金装备5幻痛高难度关卡全S打法攻略

    合金装备5幻痛高难度关卡全S打法攻略 简介 合金装备5幻痛是一款非常经典的动作冒险游戏,其高难度关卡对玩家的能力要求非常高。本文将介绍一些高效的打法攻略,帮助玩家更好地通关高难度关卡,顺利达成全S评分。 打法攻略 技能选择 在进行高难度关卡挑战时,技能的选择至关重要。建议选择潜行技能、战斗技能、研究与开发技能等,这些技能能够为玩家提供更好的隐蔽能力、战斗能力…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部