В C++, как и в C, можно назначать указатель любого типа указателю на void, но в отличие от C, в C++ невозможно присвоить указателю на void указатель любого другого типа, если явно не привести их типы.

Пример 1

int ar[5] = {4,5,6,7,8};
int *pi;
void *pv;
pv = ar; // допускается в С и С++
pi = pv; // допускается в С, но неверно в С++
pi = (int*)pv; // допускается в С и С++



В C++ можно присваивать адрес объекта произвольного типа указателю на объект базового класса. В C – нельзя.