C++通过引用和强制转换传递对象
C++ passing object by reference and casting
>我有一个基类的对象,它实际上指向一个派生类
,如下所示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
的指针或引用,您始终可以:
- 向下投掷它到
Derived
. - 只要您使用
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
尽管这较慢并且可能不是绝对必要的(尽管我不能肯定地说 - 这取决于您的要求)。如果你正确地使用虚函数,你甚至可能根本不需要做任何转换 - 这是多态性的目的之一。
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 将父类对象强制转换为子类的问题
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 已转换对象的地址
- 如何在OpenGL中使用关键事件来转换对象
- 使用父类实例化的向下转换对象
- 静态强制转换允许转换对象指针,但不允许转换整数
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 找到对象类型后,是否可以使用 static_cast 强制转换对象
- 旨在复制/转换对象的功能系列的模板
- luabind 如何隐式强制转换对象
- 转换对象
- 使用隐式可转换对象调用move重载函数时的编译错误
- 关于在 cpp 中转换对象的两个问题
- 在运行时根据实例变量强制转换对象(c++)
- 使用用户定义的类型强制转换对象
- 在c++中转换对象
- 从"int"到非标量类型赋值运算符的转换 - 对象到 int
- 在屏幕上转换对象可编程管道
- 在 C 样式类型转换期间,关于强制转换对象的地址空间的实际情况