2015-02-15 2 views
0

Child Если наследует от родителей, и я:Базовый указатель на производный объект?

Child* c = new Child(); 
Parent* p = c; 

что цель p? Если Child содержит дополнительные данные, следуете ли они с p, просто у p нет доступа к ним?

Я пытаюсь понять разницу между фактическим в памяти и доступом к указателю в зависимости от его статического типа.

+1

'p' не имеет доступа к ним. Вернее, вы не можете получить к ним доступ напрямую через 'p'. –

+3

Было бы хорошим упражнением, чтобы запустить ваш любимый редактор и проверить это самостоятельно! – MrEricSir

+1

Было бы хорошим упражнением, чтобы открыть вашу книгу на C++ и узнать о полиморфизме. –

ответ

0

В крошечном фрагменте кода показано, что невозможно указать, что МОЖЕТ быть целью 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), будет потеряна.

+0

Я думаю, вы хотите 's-> Draw()', поскольку разыменованный итератор в range-based-for является указателем. – vsoftco

+0

Можем ли мы прекратить распространение анти-шаблона владения исходными указателями? –