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

时间:2012-07-03 06:46:03

标签: c++

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

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。

3 个答案:

答案 0 :(得分:3)

只要b是指向Derived的指针或引用,您就可以随时:

  1. 向下投射到Derived
  2. 只要您使用Base
  3. ,就将其视为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,虽然这个速度较慢,可能不是必需的(尽管我不能肯定地说 - 这取决于您的要求)。如果你正确使用虚函数,你可能根本不需要进行任何转换 - 这是多态的目的之一