Что вы думаете об этом фрагменте кода C++:
Polygon* p;
if(shape=="Rectangle")
p = new Rectangle();
else if(shape=="Triangle")
p = new Triangle();
else
exit(EXIT_FAILURE);
где Rectangle и Triangle являются производными от Polygon базового класса.
Идея заключается в том, что мне нужно использовать определенные методы из производных классов, не зная, какой класс мне нужен, пока программа не запустится. Есть ли лучший способ сделать это? Он компилируется, но мне интересно, вызывается ли деструктор выбранного производного класса, чтобы определенные переменные были правильно освобождены.
Дополнительный вопрос: включает ли операция dynamic_cast копирование данных?
Спасибо :)
ИЗМЕНИТЬ:
Спасибо за все эти очень поучительные ответы.
Теперь скажем метод
bool isIsosceles()
реализован в треугольнике, но не в прямоугольнике.
Тогда сразу звоните
p->isIsosceles()
явно потерпит неудачу.
Моими первыми идеями были бы:
Объявите и реализуйте isIsosceles() как виртуальный метод в базовом классе Polygon как
virtual bool isIsosceles()
{
cout << "Isosceles means nothing to me." << endl;
exit(EXIT_FAILURE);
}
или использование dynamic_cast в операторе if.
Является ли какой-либо из этих вариантов хорошей практикой здесь?
Большое спасибо
new()
иdelete
. Также я бы рекомендовал поместить этот код в назначенный фабричный класс, который отвечает за создание правильных типов. - person πάντα ῥεῖ   schedule 04.09.2014dynamic_cast
не требует копирования данных, но включает использование информации о типе времени выполнения (RTTI). Это часто считается медленной операцией. - person YoungJohn   schedule 04.09.2014