我有一个抽象类,比如Animal
。在这个课程中,我有许多继承类,例如Cat
,Dog
,Mouse
。我有一个方法,我希望能够指针指向这些对象的指针。所以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);
我做错了什么,我怎样才能完成我正在尝试的事情?
答案 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;