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日

相关文章

  • Node.js在child_process域和错误冒泡及捕获实践

    在Node.js中,子进程模块child_process提供了一些API用于创建和管理子进程,允许Node.js应用程序在新的进程中执行命令和脚本。但是,在使用child_process创建的子进程中,可能会出现错误。本篇攻略将着重介绍子进程中的错误冒泡及其如何捕获这些错误。 错误冒泡 在一个子进程中,如果一个错误出现在子进程的某个方法中并且没有被捕获和处理…

    C 2023年5月22日
    00
  • 一篇文章弄懂C++左值引用和右值引用

    一篇文章弄懂C++左值引用和右值引用 在C++中,左值和右值是很重要的概念。我们可以使用左值引用和右值引用来访问不同类型的值。本文将详细讲解左值引用和右值引用的概念及其用法。 左值和右值 在C++中,每个表达式都具有左值或右值属性。左值是具有标识符的表达式,这些标识符可以作为左值出现在表达式中,例如变量、数组元素等等。右值是不能被放在赋值符号左边的表达式。 …

    C 2023年5月23日
    00
  • PHP设计模式概论【概念、分类、原则等】

    PHP设计模式概论 概念 设计模式是指在面向对象编程中用于解决特定问题的重复使用的经验总结。设计模式不是一个可直接转换成代码的解决方案,而是定义了一组通用的原则和规范,它们可以用于设计任何系统。 分类 设计模式可以分为三类:创建型、结构型和行为型。 创建型模式 创建型模式主要用于对象的创建,包括“工厂模式”、“抽象工厂模式”、“单例模式”、“原型模式”、“建…

    C 2023年5月22日
    00
  • C/C++ 单元自动化测试解决方案总结

    C/C++ 单元自动化测试解决方案总结 背景 C/C++ 是一门常用的编程语言,广泛应用于嵌入式系统、操作系统、游戏等领域。在实际的开发过程中,单元测试是必不可少的环节,可以确保代码的质量和稳定性。 常用的单元测试框架 C/C++ 的单元测试框架有很多,包括 Google Test,CppUnit,Boost.Test 等。这些框架可以满足大部分的单元测试需…

    C 2023年5月23日
    00
  • c++11中关于std::thread的join的详解

    简介 在C++11中,我们可以通过std::thread类来创建一个线程。该类提供了与操作系统级别的线程相关的方法,例如创建、销毁、挂起、恢复等。线程的执行中,有可能会出现多个线程共享同一个资源导致的竞争情况,此时,我们就需要对线程进行同步,在正确的时间点上对多个线程进行操作控制。join函数就是一个非常常用的同步方法。 使用方法 join函数用于等待线程的…

    C 2023年5月22日
    00
  • C语言实现五子棋游戏

    C语言实现五子棋游戏攻略 1. 五子棋游戏基本规则 五子棋是一种双人对弈的纯策略型棋类游戏,在棋盘上摆放黑白两色的棋子,先在横向、竖向或斜向连续形成五子棋者获胜。棋盘通常为15×15的方格,也有其他规格的棋盘。 2. 实现五子棋游戏的基本思路 实现五子棋游戏的基本思路是通过使用二维数组作为游戏棋盘,使用循环检查棋盘上落子的情况,判断游戏的胜负情况。 具体步骤…

    C 2023年5月23日
    00
  • 华为k662c光猫怎么样? 华为K662c拆机技巧

    华为k662c光猫怎么样? 华为K662c是一款具备家庭网关功能的光纤猫,可以直接连接光纤上网并接入路由器,同时支持IPv6、IPv4双协议栈,具有宽带业务传输和无线网络扩展等功能。总的来说,华为K662c光猫具备以下特点: 支持最高1Gbps的宽带接入 支持IPv6和IPv4双协议栈 支持4个千兆以太网端口和2个POTS电话接口 支持2.4GHz和5GHz…

    C 2023年5月23日
    00
  • 用C语言实现计算器功能

    关于用C语言实现计算器功能的攻略,可以分为以下几个步骤: 1. 设计计算器的UI界面 计算器的UI界面主要是指输入框、计算器按钮、结果框等。需要先设计好UI界面,确定每个按钮的功能以及对应输入和输出的数据类型。可以使用C语言的图形库或者基于控制台实现。 下面是一个使用控制台实现的简单计算器UI界面的示例图: ————————-…

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