C++ 函数继承详解:什么是向上转型和向下转型?
继承中,向上转型将派生类转换为基类,向下转型将基类转换为派生类。向上转型安全,信息可能丢失;向下转型危险,须确保存在对应派生类,否则返回 nullptr。
C++ 函数继承中的向上转型和向下转型
在面向对象编程中,继承是类层次结构的关键概念。当一个类继承了另一个类(基类)时,继承类(派生类)将继承基类的属性和方法。
向上转型
向上转型是指将派生类对象转换为基类对象的引用或指针。这种类型转换是安全的,因为派生类对象包含所有基类对象的数据和方法,但它可能导致信息的丢失,因为派生类的特有方法和数据在转换后将不可访问。
语法:
基类* 指针 = &派生类对象;
向下转型
向下转型是指将基类对象转换为派生类对象的引用或指针。这种类型转换是危险的,因为它可能导致无效的强制类型转换。只有当派生类对象确实存在于基类对象中时,向下转型才有效。
语法:
派生类* 指针 = dynamic_cast<派生类*>(基类对象);
dynamic_cast
操作符将执行运行时类型检查,以确保转换是安全的。如果转换无效,dynamic_cast
将返回 nullptr
。
实战案例
假设我们有一个 Shape
类作为基类,它有一个 getArea()
方法来计算形状的面积。派生类 Square
继承了 Shape
类,并添加了一个 getWidth()
方法来获取正方形的宽度。
Shape.h
class Shape {
public:
virtual double getArea() const = 0;
};
Square.h
class Square : public Shape {
public:
explicit Square(double width);
double getArea() const override;
double getWidth() const;
private:
double width;
};
main.cpp
#include "Shape.h"
#include "Square.h"
int main() {
// 创建一个正方形对象
Square square(5.0);
// 将正方形对象向上转型为形状对象
Shape* shape = □
// 通过形状对象调用 getArea() 方法
double area = shape->getArea();
std::cout << "正方形的面积: " << area << std::endl;
// 将形状对象向下转型为正方形对象
Square* square2 = dynamic_cast<Square*>(shape);
// 如果向下转型成功,则调用 getWidth() 方法
if (square2) {
double width = square2->getWidth();
std::cout << "正方形的宽度: " << width << std::endl;
} else {
std::cout << "向下转型失败" << std::endl;
}
return 0;
}
在这个例子中,我们创建了一个正方形对象,将其向上转型为形状对象,并调用了 getArea()
方法。然后,我们向下转型形状对象为正方形对象,并调用 getWidth()
方法。
以上就是C++ 函数继承详解:什么是向上转型和向下转型?的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341