Что вы думаете об этой части кода C++:- это неявное понижение, используя новый ОК?
Polygon* p;
if(shape=="Rectangle")
p = new Rectangle();
else if(shape=="Triangle")
p = new Triangle();
else
exit(EXIT_FAILURE);
где прямоугольник и треугольник проистекают из базового класса Polygon.
Идея заключается в том, что мне нужно использовать определенные методы из производных классов, не зная, какой класс мне нужен, пока программа не запустится. Есть ли лучший способ сделать это? Он компилируется, но мне интересно, вызывается ли деструктор выбранного производного класса так, чтобы определенные переменные были правильно освобождены.
Вспомогательный вопрос: включает ли операция dynamic_cast копирование данных?
Спасибо :)
EDIT:
Спасибо за все эти очень поучительные ответы.
Теперь, скажем, метод
bool isIsosceles()
осуществляется в треугольнике, но не в прямоугольнике.
Затем вызова сразу
p->isIsosceles()
, очевидно, не в состоянии.
Мои первые идеи будут либо:
Declare и осуществлять isIsosceles() в качестве виртуального метода в базовом классе Polygon, как
virtual bool isIsosceles()
{
cout << "Isosceles means nothing to me." << endl;
exit(EXIT_FAILURE);
}
или использование dynamic_cast в если заявление.
Является ли любой из этих вариантов хорошей практикой здесь?
Большое спасибо
_ «Есть ли лучший способ сделать это?» _ Да, используйте интеллектуальные указатели вместо управления памятью с помощью 'new()' и 'delete' самостоятельно. Также я бы рекомендовал поместить этот код в назначенный заводский класс, который отвечает за создание правильных типов. –
'dynamic_cast' не включает в себя копию данных, но это связано с использованием информации типа времени выполнения (RTTI). Его часто считают медленной операцией. – YoungJohn