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语言实现PAT甲级1005–Spell It Right

     非常简单的一题了,但还是交了两三次,原因:对数组的理解不足;对数字和字符之间的转换不够敏感。这将在下文中细说。 Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output every digit of the sum i…

    C 2023年4月27日
    00
  • 教你分辨C++堆与栈的区别

    分辨C++堆与栈的区别是每个C++编程学习者在学习过程中都需要掌握的重要知识点。在这里,我将会给大家提供一份完整攻略,以帮助大家更好地学习和理解这个概念。 什么是堆和栈 在C++中,堆和栈都是存储数据的地方。其中,栈是由系统自动分配和释放的,它是一块用于临时存储数据的内存空间。而堆则是由开发人员手动分配和释放的用于存储数据的内存空间。 堆和栈的区别 内存释放…

    C 2023年5月22日
    00
  • C++中的异常实例详解

    C++中的异常实例详解 异常是C++中处理错误的一种机制。当程序运行时发生错误,可以抛出一个异常,并且在需要处理异常的地方捕获该异常。本文将详细介绍异常的使用以及异常相关的概念。 抛出异常 throw语句 C++中,可以通过throw语句抛出异常,例如: throw "Something went wrong."; 上述语句抛出了一个ch…

    C 2023年5月23日
    00
  • 10种检测Python程序运行时间、CPU和内存占用的方法

    10种检测Python程序运行时间、CPU和内存占用的方法 在Python开发中,我们常常需要检测程序的运行时间、CPU和内存占用情况。这些信息对于代码优化和调试都非常有帮助。本篇文章就为大家介绍10种检测Python程序运行时间、CPU和内存占用的方法。 方法一:使用timeit 在Python中,timeit模块可以帮助我们计算代码片段的运行时间。其基本…

    C 2023年5月22日
    00
  • C程序 选择排序

    C程序 – 选择排序攻略 什么是选择排序? 选择排序是一种简单的排序算法。它的基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到序列的起始位置,直到全部待排序的数据元素排完为止。 选择排序的过程 选择排序的过程可以通过以下步骤来描述: 从序列中选择最小/最大之一的元素; 把它与待排序的数组中的第一个元素交换位置; 从剩余的元素中继续选择…

    C 2023年5月9日
    00
  • C++实现简单版图书管理系统

    C++实现简单版图书管理系统攻略 本文将介绍如何使用C++语言实现简单版图书管理系统。本系统主要包含以下功能:添加图书信息、删除图书信息、查看图书信息、修改图书信息、退出系统。 设计思路 在开始实现之前,我们需要先确定程序的设计思路。将所有的操作封装成一个类,来实现图书的添加、删除、修改、查询等操作。同时,我们需要设计出一个图书类,包含图书的基本信息。 代码…

    C 2023年5月23日
    00
  • 详解C/C++高精度算法的简单实现

    详解C/C++高精度算法的简单实现 简介 高精度算法是指在计算机上处理大数(比int、long long等数据类型的范围还要大)时,用特殊的算法进行计算的技术,它可以大大提高程序的精度。本文将详细讲解在C/C++语言中实现高精度算法的方法。 实现思路 实现高精度算法的主要思路是将大数拆分成多个小数,每个小数用数组存储数据,然后借助数组的运算来实现对大数的计算…

    C 2023年5月23日
    00
  • C语言中的正则表达式使用示例详解

    C语言中的正则表达式使用示例详解 正则表达式是一种通用的文本匹配模式,可以在C语言中用来进行字符串的匹配和处理。C语言提供了regex库来支持正则表达式的使用。接下来,将为您详细讲解C语言中正则表达式的使用,包括正则表达式语法、函数调用和示例说明。 正则表达式语法 正则表达式语法是一组规则,用于描述文本模式匹配的方式。在C语言中,正则表达式的语法由一些特殊字…

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