我有一个基类的对象,实际上指向像这样的派生类
Base *b = new Derived()
我想知道的是,是否可以通过引用将基类指针传递给可以将对象强制转换回Derived类的函数。像这样的东西
Dummy_cast_fn(&b) // casts b to derived class
调用Dummy_cast_fn
后,b
应该拥有Derived类的完整副本(无切片)。
修改 我不理解因为使用指针而没有切片的部分。我的问题是Derived类是从函数调用返回到共享库而我无法访问Derived的.h文件。我所拥有的信息是Derived基于Base类。我可以访问Base.h所以我可以实例化Base的对象,但是当我尝试访问Derived中定义但不在Base中定义的函数时会出现问题。所以我想知道我是否可以将Base转换为Derived类型,然后我将能够访问Derived中定义的函数而不是Base。
答案 0 :(得分:3)
只要b
是指向Derived
的指针或引用,您就可以随时:
Derived
。Base
。b
醇>
即,确定使用b
可以执行的操作的是静态类型,在本例中为Base
。但是,由于它实际指向Derived
,因此您可以始终向下转发它。但是,要将其用作Derived
,您必须拥有一个类型为Derived
的变量。
所以,如果Dummy_cast_fn
的目的仅仅是修复b
中的内容 - 那就没用了。如果对象被切片,则无法修复它。但是在你的情况下,没有切片,因为你正在使用指针。
根据问题的编辑进行编辑:
首先,你的Derived
对象没有被切片。让我们摆脱桌面。你有一个指向完整Derived
的指针(假设你已经通过了),但是在使用Base
指针时你只能访问它的Base
部分。现在,您说您没有Derived
的定义。这意味着您将无法向下转换为该类型,因为编译器不知道它是如何定义的。没有铸造在这里工作。如果您没有sum
的定义,则没有合法的C ++方式可以调用Derived
函数。
我想知道为什么Derived
的作者在没有提供其定义的情况下为您提供了文档。有了这种多态性,提供者通常会让用户拥有一些“接口”,将实际类型留作内部实现细节。如果您因为没有定义而无法使用Derived
,那么让您拥有其文档毫无意义。
答案 1 :(得分:2)
您无法将Base*
更改为Derived*
,但您可以Derived*
使用{{1}指向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
}
答案 2 :(得分:2)
您无法更改Base* b
的类型,但您可以创建新指针
Derived* p = static_cast<Derived*>(b);
并使用它。将b
声明为Base*
后,您无法修改其类型。您也可以使用dynamic_cast
,虽然这个速度较慢,可能不是必需的(尽管我不能肯定地说 - 这取决于您的要求)。如果你正确使用虚函数,你可能根本不需要进行任何转换 - 这是多态的目的之一