C++通过引用和强制转换传递对象

C++ passing object by reference and casting

本文关键字:转换 对象 引用 C++      更新时间:2023-10-16

>我有一个基类的对象,它实际上指向一个派生类

,如下所示
Base *b = new Derived()

我想知道的是,是否有可能通过引用将基类指针传递给某个可以将对象转换回派生类的函数。 像这样的东西

Dummy_cast_fn(&b) // casts b to derived class

调用 Dummy_cast_fn 后,b应该有一个派生类的完整副本(无切片)。

编辑我不明白由于使用了指针而没有切片的部分。我的问题是派生类是从对共享库的函数调用返回的,我无权访问派生的 .h 文件。我唯一掌握的信息是派生基于基类。我可以访问 Base.h,因此我可以实例化 Base 的对象,但是当我尝试访问在派生中定义但不在 Base 中定义的函数时出现问题。所以我想知道我是否可以将 Base 类型转换为派生类型,然后我将能够访问在派生而不是在 Base 中定义的函数。

只要

b是指向Derived的指针或引用,您始终可以:

  1. 向下投掷它到Derived.
  2. 只要您使用b,就将其视为Base

也就是说,决定您可以使用b做什么的是它的静态类型,在本例中为 Base .但是,由于它实际上指向 Derived ,您始终可以向下投射它。然而,要将其用作Derived您必须有一个类型为 Derived 的变量。

因此,如果Dummy_cast_fn的目的只是为了修复b中的某些内容 - 那是没有用的。如果一个对象被切片,没有什么可以修复它。但在您的情况下,没有切片,因为您使用的是指针。

根据问题的编辑进行编辑:

首先,您Derived对象没有切片。让我们把它从桌面上移开。您有一个指向完整Derived的指针(假设这是您传递的内容),但您只能在使用 Base 指针时访问其Base部分。现在,你说你没有Derived的定义.这意味着您将无法向下转换为该类型,因为编译器不知道它是如何定义的。这里没有铸造工作。如果您没有 的定义,则没有合法C++方法可以调用该sum函数Derived

我确实想知道为什么Derived的作者为您提供了其文档而没有提供其定义。通过这种多态性,提供程序通常允许用户具有一些"接口",将实际类型保留为内部实现细节。如果您因为没有定义而无法使用Derived,那么让您拥有其文档是没有意义的。

您不能将Base*更改为Derived*,但您可以使用dynamic_cast来获取指向Base*指向对象的Derived*

Derived* d = dynamic_cast<Derived*>(b);
if (d) {
  // cast was succesful
} else {
  // cast failed, 
  // e.g. because b* does not point to a Derived* but some other derived type
}

您无法更改Base* b的类型,但是可以创建新指针

    Derived* p = static_cast<Derived*>(b); 

并使用它。将b声明为 Base* 后,无法修改其类型。您也可以使用dynamic_cast尽管这较慢并且可能不是绝对必要的(尽管我不能肯定地说 - 这取决于您的要求)。如果你正确地使用虚函数,你甚至可能根本不需要做任何转换 - 这是多态性的目的之一。