Я прочитал некоторые ответы в What is the proper use case for dynamic_cast.Рекомендуется ли использовать динамический кастинг для предоставления входных данных для виртуальной функции производного класса?
линия, которая лучше всего соответствует моей ситуации здесь
#include<iostream>
class Shape
{
public:
virtual void draw()=0;
virtual ~Shape(){};
};
class Rectangle : public Shape
{
public:
int length;
int breath;
void draw()
{
std::cout<<"RECTANGE"<<std::endl;
}
};
class Circle : public Shape
{
public:
int diameter;
void draw()
{
std::cout<<"CIRCLE"<<std::endl;
}
};
/*Abstract Factory*/
Shape* getShapeObj(int type)
{
switch(type)
{
case 1:
return new Rectangle;
case 2:
return new Circle;
/* many types will be added here in future. */
}
return NULL;
};
void drawShapes(Shape *p_shape[],int len)
{
for(int i=0;i<len;i++)
p_shape[i]->draw();
}
int main()
{
Shape *l_shape[2];
l_shape[0]=getShapeObj(1);
l_shape[1]=getShapeObj(2);
Rectangle *l_rec=dynamic_cast<Rectangle*>(l_shape[0]);
if(l_rec)
{
l_rec->length=10;
l_rec->breath=20;
}
Circle *l_circle=dynamic_cast<Circle*>(l_shape[1]);
if(l_circle)
l_circle->diameter=25;
drawShapes(l_shape,2);
}
По сути, виртуальные функции работают только в некоторых случаях, не все из них.
Моя проблема - передать вход для виртуальной функции, и входы будут отличаться от типа к типу. Рекомендуется ли использовать динамический приведение?
* ", чтобы передать вход для виртуальной функции, и входы будут различаться от типа к типу" * - Я не вижу места в вашем коде, где вы используете виртуальные функции с некоторыми входами ... Не могли бы вы уточнить? Вы не можете переопределить виртуальную функцию и изменить ее параметры ... – Holt
Что делает вышеприведенный код таким, что 'Rectangle * l_rec = new Rectangle (10, 20);' не достигает? (Или даже лучше 'auto l_rec = std :: make_unique (10,20);'). Я понимаю, что это упрощенный пример, но я не вижу, как будет выглядеть сложный пример. –
@Holt обновил код с помощью разработанного примера –