Из стандарта C ++ (1998)
За исключением случаев, когда
инициализация по определению пользователя
конвертация (13.3.1.4, 13.3.1.5), а
правильно сформированное неявное преобразование
последовательность является одним из следующих
формы: стандартное преобразование
последовательность (13.3.3.1.1), -a пользователь
определяется ...
13.3.3.1.1
Не более одного преобразования из каждого
категория разрешена в одном
стандартная последовательность преобразования
Таким образом, c ++ НЕ может неявно преобразовывать два раза подряд: из указателя в указатель, а затем снова из указателя.
Чтобы прояснить это, рассмотрите такое объявление RemoveObj
void RemoveObj(Parent ** ppObj)
И вы увидите эту ошибку
error: invalid conversion from 'Child**' to 'Parent**'
Вы должны использовать явное преобразование, например
RemoveObj((Parent**)&pCObj);
RemoveObj((Parent*&)&pCObj);
или нужно изменить
void RemoveObj(Parent *& ppObj)
до
void RemoveObj(Parent * ppObj)
или
template <typename T>
void RemoveObj(T *& pObj)
{
delete pObj;
pObj = 0;
}