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# Newtonsoft.Json 的使用说明

    C# Newtonsoft.Json是一个常用的Json操作库,使用它可以方便地实现Json格式的数据的序列化与反序列化。下面来详细讲解一下如何使用该库。 1. 安装Newtonsoft.Json 首先需要在项目中安装Newtonsoft.Json库。可以通过Nuget包管理器搜索 “Newtonsoft.Json” 进行安装,也可以从 官方网站 下载安装包…

    C 2023年5月23日
    00
  • C全局和静态指针

    C语言中指针是一种强大的数据类型,它可以直接访问内存中的数据,极大地提高了程序的灵活性和效率。其中全局指针和静态指针是指针的两种不同的声明方式。 全局指针 全局变量指的是定义在函数之外的变量,它的作用域从整个程序开始到整个程序结束,具有全局性。全局指针也是定义在函数之外的指针变量。 在使用全局指针时,需要注意以下几点: 全局指针变量必须初始化(可以在定义时进…

    C 2023年5月9日
    00
  • C语言 保留字

    C语言保留字的使用攻略 在C语言中,保留字是指被C语言编译器预先定义并且有特定含义的关键字。C语言中共有32个关键字,这32个关键字在程序中不能被用作变量名或其他标识符名称。本文将详细介绍C语言中保留字的使用方法。 如何使用C语言的保留字 C语言中的保留字使用非常简单,只需要直接使用即可。以下是一些常见的保留字: auto break case char c…

    C 2023年5月9日
    00
  • C语言文件操作的入门详解教程

    C语言文件操作的入门详解教程 在C语言程序中,文件操作是一项非常重要的技能。文件操作可以让程序读取和写入文件内容,将程序的输入和输出保存在文件中,实现文件的创建、读取、写入和删除等操作。本教程将从基本概念和语法讲解开始,深入介绍C语言文件操作的方法和技巧,旨在帮助初学者快速上手,并能完成各种文件操作任务。 1.文件操作基础 在C语言中,文件操作有两种基本方式…

    C 2023年5月23日
    00
  • Windows OpenGL ES 图像 GPUImageLookupFilter

    零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 特效 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES …

    C语言 2023年4月18日
    00
  • C语言计算日期差的方法示例

    C语言计算日期差的方法示例 介绍 计算日期差是一道常见的编程问题,对于涉及到日期的应用程序而言,该问题尤为重要。C语言可以通过一些方法来计算日期差,包括使用time.h头文件中的函数以及手写计算公式。本文将为你介绍两种计算日期差的方法,并提供示例代码和详细注释。 时间戳方法 计算日期差最常见的方法是使用时间戳。时间戳是一个表示时间的整数值,通常指的是1970…

    C 2023年5月23日
    00
  • C语言编程时常犯十八个错误小结

    以下是详细讲解“C语言编程时常犯十八个错误小结”的完整攻略: 一、背景介绍 C语言是一门广泛使用的编程语言,但它也有很多容易犯的错误。这些错误不仅会导致程序的崩溃,还会影响到程序的运行效率。为了帮助C语言入门者避免这些错误,本文会对常见的18个错误进行分析和总结,供大家参考。 二、常见错误及解决方法 1. 数组越界 如果使用一个不存在的数组下标来访问数组中的…

    C 2023年5月23日
    00
  • php 读写json文件及修改json的方法

    下面给出 PHP 读写 JSON 文件并修改 JSON 的方法的详细攻略。 一、读取 JSON 文件 PHP 中可以使用 json_decode 函数来读取 JSON 文件,将 JSON 字符串转化为 PHP 中的数组或对象。 示例代码如下: $file_path = "test.json"; $json_string = file_ge…

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