2

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

Base *b = new Derived()

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

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

调用后Dummy_cast_fnb应该有 Derived 类的完整副本(没有切片)。

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

4

3 回答 3

3

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

  1. 向下转换为Derived.
  2. 只要Base您使用b.

也就是说,决定你能做什么的b是它的静态类型,在这种情况下是Base. 但是,由于它实际上指向 a Derived,因此您始终可以向下转换它。然而,要将它用作 a Derived,您必须有一个类型也是Derived如此的变量。

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

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

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

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

于 2012-07-03T06:54:47.233 回答
2

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

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
}
于 2012-07-03T06:49:57.367 回答
2

你不能改变你的类型,Base* b但是你可以创建一个新的指针

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

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

于 2012-07-03T06:52:37.423 回答