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语言实现单词小帮手

    C语言实现单词小帮手攻略 介绍 单词小帮手是一个简单的命令行工具,可以将输入的英文单词翻译为中文,并给出其中文释义、发音、例句等信息。本攻略将会详细讲解如何使用C语言实现单词小帮手。 步骤 1. 数据获取 单词小帮手需要获取两种数据:英文单词和其翻译信息。我们可以通过以下方法获取这些数据: 使用爬虫抓取在线词典的数据 从一个本地的词库文件中读取数据 在有网络…

    C 2023年5月23日
    00
  • 实例讲解如何在PHP的Yii框架中进行错误和异常处理

    在Yii框架中进行错误和异常处理需要遵循一定的规范和流程。以下是在Yii框架中进行错误和异常处理的完整攻略: 错误处理 Yii框架提供了CErrorHandler类处理应用程序运行期间产生的错误。CErrorHandler类使用handleError()来捕获错误,并且渲染错误页面或记录错误信息。 捕获错误 set_error_handler(functio…

    C 2023年5月23日
    00
  • 详解关于JSON.parse()和JSON.stringify()的性能小测试

    关于“详解关于JSON.parse()和JSON.stringify()的性能小测试”攻略,以下是完整的说明: 标题 1. 概述 在JavaScript中,JSON.parse()和JSON.stringify()是两个常用的方法,前者将JSON格式的字符串转换为JavaScript对象,后者则是将JavaScript对象转换为JSON格式的字符串。同时,在…

    C 2023年5月23日
    00
  • 学生成绩管理系统C语言代码实现

    学生成绩管理系统是一个非常典型的C语言应用程序,下面将逐步讲解该系统的完整实现过程。 系统需求分析 首先,我们需要根据需求分析设计系统的功能和流程。在这个例子中,学生成绩管理系统简要需要实现以下功能: 管理员可以输入多个学生的基本信息,包括姓名、学号、班级等。 管理员可以为每个学生输入多门学科的成绩。 管理员可以查看每个学生的平均成绩和总分数,并且可以查看学…

    C 2023年5月23日
    00
  • .NET(C#)连接各类数据库代码-集锦

    . 前言 本文将为大家介绍如何使用.NET (C#)代码连接各种不同类型的数据库。无论是关系型数据库,还是NoSQL数据库,本文都将为您提供一条清晰明了的攻略。本文例举了连接MySQL和MongoDB两个数据库的示例,以供读者参考和学习。 . 连接MySQL数据库 连接MySQL数据库可以使用MySQL官方提供的Connector/NET组件,该组件提供了与…

    C 2023年5月22日
    00
  • C++中的String的常用函数用法(最新推荐)

    下面是关于C++中的String的常用函数用法的完整攻略: 1. String的基础用法 在C++中使用String需要引入头文件,并且使用std::命名空间来定义,下面是一个String的基本使用范例: #include <iostream> #include <string> int main() { std::string st…

    C 2023年5月23日
    00
  • 蒲公英x4c路由器怎么样 蒲公英x4c路由器详细评测

    蒲公英x4c路由器怎么样 蒲公英x4c路由器详细评测 蒲公英x4c路由器概述 蒲公英x4c路由器是一款基于OpenWRT固件开发的智能高速路由器,具有高速稳定、易于管理、安全稳定等特点。它采用了千兆网口,堡垒机级别的安全保障系统和智能家居和NAS多功能集成等设计,支持数据加速、加密、压缩等多项技术,既符合个人用户的需求,也符合企业用户的需求。 蒲公英x4c路…

    C 2023年5月23日
    00
  • 解决开机时svchost.exe的CPU占用率过高导致系统异常缓慢

    针对“解决开机时svchost.exe的CPU占用率过高导致系统异常缓慢”的问题,可以按照以下步骤进行: 1. 确认问题 首先要确认svchost.exe的CPU占用率过高是否是系统缓慢的主要原因。可以打开任务管理器(快捷键Ctrl+Shift+Esc),在进程标签页中找到svchost.exe进程,将其展开,查看对应的服务列表。如果某个服务的CPU占用过高…

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