转换基类的双指针

时间:2011-03-27 02:11:25

标签: c++ inheritance

我有一个抽象类,比如Animal。在这个课程中,我有许多继承类,例如CatDogMouse。我有一个方法,我希望能够指针指向这些对象的指针。所以void someMethod(Animal **anAnimal);

这是如何实现的?看来我不能像这样向上投球。我正在尝试以下方法:

Dog *d = new Dog(x); //some parameter x.
Animal **animal = &d;
someMethod(animal);

//where someMethod has the method signature...
void someMethod(Animal **anAnimal);

我做错了什么,我怎样才能完成我正在尝试的事情?

3 个答案:

答案 0 :(得分:9)

您需要Animal*

Dog* d = new Dog(x);
Animal* a = d;
Animal** animal = &a;
someMethod(animal);

Animal**只能指向Animal*。如果可以指向Dog*那将是非常糟糕的。如果可以的话,你可以这样做:

Dog* d = new Dog(x);
Animal** animal = &d;
*animal = new Hippopotamus();

现在d指向Hippopotamus,这确实非常错误。

答案 1 :(得分:0)

您需要引入Animal*类型的临时文件:

Dog *d = new Dog(x); //some parameter x.
Animal *a = d;
Animal **animal = &a;
someMethod(animal);

原因是& d为Dog**,即使Animal**可以转换为Dog*,也无法转换为Animal*

通常情况下你会使用类似的内容修复此内联(警告 - 不编译!):

Dog *d = new Dog(x); //some parameter x.
Animal **animal = &(static_cast<Animal*>(d));
someMethod(animal);

但是,这是不可能的,因为static_cast的返回值是临时的(技术上,它是rvalue),因此您无法获取其地址。因此,您需要额外的Animal* local才能使其正常工作。

答案 2 :(得分:0)

必须进行演员表。

Animal **animal = (Animal **)&d;