Кастинг двойных указателей базовых классов - PullRequest
3 голосов
/ 27 марта 2011

У меня есть класс Abstract, скажем 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);

Что я делаю не так, и как я могу выполнить то, что я пытаюсь?

Ответы [ 3 ]

9 голосов
/ 27 марта 2011

Вам нужно 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, что на самом деле очень неправильно.

0 голосов
/ 27 марта 2011

Собираюсь сыграть.

Animal **animal = (Animal **)&d;
0 голосов
/ 27 марта 2011

Вам необходимо ввести временный тип 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 для этой работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...