В крошечном фрагменте кода показано, что невозможно указать, что МОЖЕТ быть целью p
. Однако, в общем, использование указателя или ссылки на базовый класс для хранения объектов, которые являются полиморфными по своей природе, является обычной практикой. Например, классический пример формы:
// Base class for all shapes.
class Shape
{
...
};
class Circle: public Shape
{
...
};
class Square: public Shape
{
...
};
Теперь, если мы хотим сохранить кучу форм, мы можем использовать:
std::vector<Shape*> shapes;
shapes.push_back(new Circle);
shapes.push_back(new Square);
, а затем сделать:
for(auto &s : shapes)
{
s.Draw(); // Draw shapes on screen...
}
Вектор должен содержать указатели или ссылки, так что тип определяется фактическим сохраненным объектом. Если бы мы сделали вектор std::vector<Shape> shapes
, тогда мы получили бы «нарезку», где любая дополнительная информация, хранящаяся в Circle
(например, radius
) или Square
(например, side
), будет потеряна.
'p' не имеет доступа к ним. Вернее, вы не можете получить к ним доступ напрямую через 'p'. –
Было бы хорошим упражнением, чтобы запустить ваш любимый редактор и проверить это самостоятельно! – MrEricSir
Было бы хорошим упражнением, чтобы открыть вашу книгу на C++ и узнать о полиморфизме. –