Я относительно новичок в C ++ и работаю над базовым движком трехмерного рендеринга, использующим OpenGL. У меня есть следующая проблема: у меня есть класс с именем GeomEntity, который является базовым классом для всех геометрических примитивов. У меня есть другой класс, называемыйDefaultMaterial, который является базовым классом для всех материалов (состоит из различных типов шейдерных программ). Потому что у меня будет много типов материалов, таких как: ColorMaterial, TextureMaterial, AnimatedMaterial и т. Д. Мне нужно поместить ссылку на материал в GeomEntity.класс, так что из основного приложения я могу установить любой материал с помощью этой функции:
void GeomEntity ::addMaterial (const DefaultMaterial *mat){
material=mat;////material is the member variable pointer of type DefaultMaterial
}
Но дело в том, что хотя все эти материалы получены из DefaultMaterial, все они имеют свои уникальные методы, которыеЯ не могу активировать, если я по умолчанию ссылаюсь на них в переменной DefaultMaterial.Так, например, в основном приложении:
Sphere sphere;
....
sphere.addMaterial(&animMaterial);///of type AnimatedMaterial
sphere.material->interpolateColor(timerSinceStart);
///doesn't happen anything as the sphere.material is
/// of type DefaultMaterial that has no interpolateColor() method
Я знаю, что могу использовать шаблоны или приведение типов, но я хотел бы услышать о лучших практиках этого вида полиморфизма в C ++. В Java или C # я бы хотелдействительно используйте что-то вроде этого:
((AnimatedMaterial)sphere.material).interpolateColor(timerSinceStart);