欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > C++ 上下行转换(类对象、继承)

C++ 上下行转换(类对象、继承)

2025/10/17 6:50:58 来源:https://blog.csdn.net/m0_64240990/article/details/142065472  浏览:    关键词:C++ 上下行转换(类对象、继承)

前言

在C++中,类型转换是常见的编程操作。上下行转换是类型转换的重要概念,其主要内容是关于在C++中两个有继承关系的类的相互转换。

上行转换

上行转换是指将派生类的对象转换为基类的对象。这是自动且安全的,因为派生类对象包含所有基类的信息。

代码示例

class Parent
{
public:int getValue(){return i;}private:int i = 1;
};class Child : public Parent
{
public:int getValue(){return d;}private:int d = 2;
};int main()
{Child c;cout << c.getValue() << endl; Parent* p = &c;cout<<p->getValue()<<endl;return 0;
}

输出结果

2
1

在该段代码中,Child重写了父类ParentgetValue函数,使其获取的变量值从i变为自身独有变量d;所以在没有上行转换时,类Child实例对象c调用的是类Child内的getValue函数;而在进行了上行转换后,对象c调用的是类Parent内的getValue函数

下行转换

下行转换是指将基类的对象转换为派生类的对象。这通常不是自动的,并且需要显式地进行类型转换。在C++中,可以使用 dynamic_cast 来尝试下行转换,它会检查转换是否安全。如果转换失败,则 dynamic_cast 返回一个空指针或对非指针类型抛出异常。

代码示例

class Parent
{
public:virtual int getValue(){cout << "下行转换::父类" << endl;return i;}private:int i = 1;
};class Child : public Parent
{
public:int getValue() override{cout << "下行转换::子类" << endl;return d;}void setValue(int value){d = value;}private:int d = 2;
};  int main()
{Parent* p = new Parent();p->getValue();Child* c = dynamic_cast<Child*>(p);c->getValue();return 0;
}

输出结果

下行转换::父类

在代码示例中,我们实例一个父类对象,然后用dynamic_cast<Child*>()将其赋值给一个子类Child指针 。最后执行getvalue函数,打印信息到终端。从输出结果来看, c->getValue();执行存在问题,没有打印相关信息。

结论

  • 上行转换是安全的
  • 下行转换时不安全的

分析

在系统中,我们的代码存储在内存中。系统执行代码,也是需要找到代码的地址。在下行转换后,对象无法找到子类的相关函数,所以执行出现问题;

通俗理解:
如果将父类比作集装箱,继承父类的子类比作一辆载着集装箱的卡车;
那么上行转换就是:存在一辆载着集装箱的卡车,我们从看整体(车和集装箱)变为 仅看集装箱,虽然我们的视角固定在集装箱上,但是车也是存在的;
相对而言,下行转换就是:存在一个集装箱,我们的视角从仅看集装箱 改变为看整体,但是这个整体只有集装箱,没有车。所以我们看不到车;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词