首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ -向上转换和向下转换

C++ -向上转换和向下转换
EN

Stack Overflow用户
提问于 2016-01-30 20:59:37
回答 2查看 30.4K关注 0票数 5

在我的示例中:

在向上转换时,第二个d.print()不应该调用print "base“吗?

它不是"d“派生对象向上转换为基类对象吗?

在向下预测方面,它有什么优势?

你能以一种实用的方式解释向上和向下吗?

代码语言:javascript
复制
#include <iostream>
using namespace std;

class Base {
public:
    void print() { cout << "base" << endl; }
};

class Derived :public Base{
public:
    void print() { cout << "derived" << endl; }

};

void main()
{
    // Upcasting
    Base *pBase;
    Derived d;
    d.print();
    pBase = &d;
    d.print();

    // Downcasting
    Derived *pDerived;
    Base *b;
    pDerived = (Derived*)b;
}
EN

回答 2

Stack Overflow用户

发布于 2016-01-30 21:10:37

向上转换在C++中是隐式的,并且在处理虚拟调度时经常使用。换句话说,您有一个指向Base的指针,您可以从该指针访问整个类层次结构的公共接口,并且可以在运行时进行选择。这里假设您的接口函数被标记为virtual。示例:

代码语言:javascript
复制
Base* pBase; 
cin >> x; 
if(x == 0) // this is done at runtime, as we don't know x at compile time
    pBase = new Derived1;
else
    pBase = new Derived2;

pBase->draw(); // draw is a virtual member function

在这些在运行时完成分派的情况下,它是非常有用的。简单地说,向上转换允许将派生类视为基类(通过其公共接口)。

向下转换的用处不大,应该尽可能避免使用IMO。一般来说,这是糟糕设计的标志,因为很少需要将Base对象转换为派生对象。可以通过dynamic_cast完成(并检查结果),如下所示

代码语言:javascript
复制
Base* pBase = new Derived; // OK, the dynamic type of pBase is Derived
Derived* pDerived = dynamic_cast<Derived*>(pBase);
if(pDerived) // always test  
{
    // success
}
else
{
    // fail to down-cast
}

This link为这个主题提供了一个非常有用的介绍。

票数 14
EN

Stack Overflow用户

发布于 2016-01-30 21:06:34

您需要使用虚拟方法才能启用RTTI

在您的情况下,由于您使用的是C++,因此您应该依赖更安全的强制转换机制。因此,您应该使用dynamic_cast<Derived*>(b)而不是(Derived*)b。这使您可以确保您实际拥有指向基类(接口)的对象的指针,该基类(接口)是通过强制转换Derived类型的对象而获得的。This page提供了进一步的解释。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35102079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档