gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:38:17 26 4
gpt4 key购买 nike

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

Base *b = new Derived()

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

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

在调用 Dummy_cast_fn 之后,b 应该有派生类的完整拷贝(无切片)。

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

最佳答案

只要 b 是一个指针或对 Derived 的引用,您就可以:

  1. 将其向下转换为 Derived
  2. 只要您使用 b,就将其视为 Base

即,决定您可以使用 b 做什么的是它的静态类型,在本例中为 Base。但是,由于它实际上指向 Derived,因此您始终可以向下转换它。然而,要将它用作 Derived,您还必须有一个类型为 Derived 的变量。

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

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

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

我确实想知道为什么 Derived 的作者为您提供了它的文档而不提供它的定义。通过这种多态性,提供者通常让用户拥有一些“接口(interface)”,而将实际类型留作内部实现细节。如果您不能使用 Derived 因为您没有它的定义,那么让您拥有它的文档是没有意义的。

关于C++ 通过引用和转换传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11305776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com