C++ 基类指针和子类指针相互赋值的实现方法

要实现基类指针和子类指针相互赋值,需要使用向上转型和向下转型实现。

向上转型是将子类的指针转换为基类的指针,可以使用static_cast操作符或者在函数中使用传递引用或指针的方式进行转型,其格式如下所示:

基类指针名 = static_cast<基类*>(子类指针名);

或者

void 函数名(基类& 或指针名,子类& 或指针名)
{
    基类指针名 = &子类名;
}

而向下转型是将基类指针转换为子类指针,需要使用dynamic_cast操作符进行指针转型,其格式如下所示:

子类指针名 = dynamic_cast<子类*>(基类指针名);

接下来,两条示例说明:

  1. 以动物为基类,狗和猫为子类的示例
class Animal {
public:
    virtual void sound() { cout << "ANIMAL SOUND" << endl; }
    virtual ~Animal() {}
};

class Dog : public Animal {
public:
    void sound() { cout << "WOOF" << endl; }
};

class Cat : public Animal {
public:
    void sound() { cout << "MEOW" << endl; }
};

int main() {
    Animal* a = new Animal();
    Dog* d = new Dog();
    Cat* c = new Cat();

    //向上转型,将指向子类对象的指针转换为指向基类对象的指针
    Animal* animalPtr = static_cast<Animal*>(d);

    //向下转型,将指向基类对象的指针转换为指向子类对象的指针
    Dog* dogPtr = dynamic_cast<Dog*>(animalPtr);

    //输出结果
    animalPtr->sound(); //WOOF
    dogPtr->sound();    //WOOF

    //将指向子类对象的指针转换为指向基类对象的指针
    animalPtr = c;

    //向下转型,将指向基类对象的指针转换为指向子类对象的指针
    Cat* catPtr = dynamic_cast<Cat*>(animalPtr);

    //输出结果
    animalPtr->sound(); //MEOW
    catPtr->sound();    //MEOW

    //释放动态分配的内存
    delete a;
    delete d;
    delete c;

    return 0;
}

在这个示例中,我们首先创建了一个基类对象和两个子类对象(狗和猫)。然后使用向上转型和向下转型实现了基类指针和子类指针之间的相互转换。最后,我们调用每个指针的sound()函数,输出其特有的声音。

  1. 以图形为基类,圆形和矩形为子类的示例
class Shape {
public:
    virtual float area() { return 0; }
    virtual ~Shape() {}
};

class Circle : public Shape {
private:
    float r;
public:
    Circle(float R) { r = R; }
    float area() { return 3.14 * r * r; }
};

class Rectangle : public Shape {
private:
    float h, w;
public:
    Rectangle(float H, float W) { h = H; w = W; }
    float area() { return h * w; }
};

int main() {
    Shape* s;
    Circle c(5);
    Rectangle r(4, 6);

    //向上转型,将指向子类对象的指针转换为指向基类对象的指针
    s = &c;

    //输出结果
    cout << "Circle area: " << s->area() << endl; //78.5

    //向下转型,将指向基类对象的指针转换为指向子类对象的指针
    Circle* cPtr = dynamic_cast<Circle*>(s);

    //输出结果
    cout << "Circle area: " << cPtr->area() << endl; //78.5

    //将指向子类对象的指针转换为指向基类对象的指针
    s = &r;

    //输出结果
    cout << "Rectangle area: " << s->area() << endl; //24

    //向下转型,将指向基类对象的指针转换为指向子类对象的指针
    Rectangle* rPtr = dynamic_cast<Rectangle*>(s);

    //输出结果
    cout << "Rectangle area: " << rPtr->area() << endl; //24

    return 0;
}

在这个示例中,我们首先定义了一个基类对象和两个子类对象(圆形和矩形)。然后使用向上转型和向下转型实现了基类指针和子类指针之间的相互转换。最后,我们通过每个指针调用在每个类中实现的计算面积的函数,输出它们的面积。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 基类指针和子类指针相互赋值的实现方法 - Python技术站

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

相关文章

  • C++ TCP网络编程详细讲解

    C++ TCP网络编程详细讲解 简介 TCP网络编程是指基于传输控制协议(TCP)实现的网络通信,其主要特点是数据传输稳定可靠,适用于对数据传输要求较高的应用场景。在C++中,我们可以使用一些网络编程库(如Boost.Asio、Winsock等)来实现TCP网络编程。 步骤 1. 创建socket 在进行TCP网络编程时,我们需要先创建一个socket,通过…

    C 2023年5月24日
    00
  • C++实现简易反弹小球游戏的示例代码

    好的。首先,让我们来讲解如何使用C++实现简易反弹小球游戏的完整攻略。 准备工作 在开始编写代码之前,我们需要准备一些工具和环境: C++编译器(建议使用Visual Studio等集成开发环境) 游戏引擎或者相关库(例如SDL2等) 在本篇攻略中,我们将使用SDL2库来实现我们的游戏。因此,在开始之前,我们需要安装SDL2库及其所需的依赖项。 编写代码 接…

    C 2023年5月24日
    00
  • python基础教程之popen函数操作其它程序的输入和输出示例

    Python基础教程之popen函数操作其他程序的输入和输出示例 什么是popen函数? popen函数是Python中一个用于打开一个进程作为管道的函数。通过它,你可以利用子进程的标准输入、输出、错误流和父进程之间的通信。popen函数本质上使用子进程来读取、写入或处理数据。 如何使用popen函数? 使用popen函数可以通过以下步骤来完成: 导入sub…

    C 2023年5月22日
    00
  • MFC实现学生选课系统

    MFC实现学生选课系统攻略 1. 前言 学生选课系统是大学教学管理系统中必不可少的一部分,本文介绍如何使用MFC来实现一个学生选课系统,包括系统框架设计、用户界面设计以及基本功能实现等部分内容。 2. 系统框架设计 2.1 整体思路 学生选课系统主要包含两个模块:学生信息管理模块和课程信息管理模块。首先需要创建一个主窗口来容纳所有的子窗口,并通过主窗口提供菜…

    C 2023年5月23日
    00
  • Android保存App异常信息到本地

    下面是一份完整的攻略,详细讲解了如何在Android应用中保存App异常信息到本地: 1. 异常信息及其重要性 在Android应用开发中,异常信息是非常重要的一个方面。当应用程序出现错误或崩溃时,异常信息能够提供有关错误的详细信息,例如错误的栈追踪信息和错误发生的原因。 因为Android应用的结构和环境复杂,异常情况的出现也是时有发生。在使用Androi…

    C 2023年5月23日
    00
  • 约瑟夫环问题(数组法)c语言实现

    约瑟夫环问题(数组法)C语言实现 问题描述 有 $n$ 个人围成一圈,第 $m$ 个人开始报数,报到 $m$ 的人出圈,然后从出圈的下一个人开始继续报数,直到圈中只剩下一人。求出该人的编号。 解法思路 采用数组法解决约瑟夫环问题,主要的思路是:构建一个大小为 $n$ 的数组,来表示 $n$ 个人在约瑟夫环中的位置,将这些位置依次删除,直到只有一个人为止。 具…

    C 2023年5月23日
    00
  • C语言 结构体和联合体的区别

    C语言 结构体和联合体的区别 什么是结构体 在 C 语言中,结构体是一种自定义数据类型,它允许程序员将不同类型的变量组合在一起,形成一个数据集合。结构体是由一组多个变量组成的新的数据类型,在定义结构体时,需要定义这个结构体包含的成员变量的类型和名称。 通常定义结构体的方式为: struct 结构体名称{ 成员变量1; 成员变量2; ……….. 成…

    C 2023年5月10日
    00
  • c++中new的三种用法详细解析

    C++中new的三种用法详细解析 new 是 C++ 中一个非常重要的关键字,主要用于动态分配内存。通常情况下,使用 new 就意味着需要手动管理这块内存的释放。new 的语法形式有三种,分别是: new operator 以 new 运算符来申请动态内存,并返回该内存的地址,也就是指针类型。 语法是 new 数据类型;。创建出来的对象默认初始化,如果需要初…

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