Это будет трудно объяснить, поэтому позвольте мне привести пример:
Представьте, что у вас есть 10 элементов графического интерфейса, которые наследуют членов из одного абстрактного базового класса. Вы хотите иметь возможность использовать цикл, чтобы проверить, щелкнул ли пользователь какой-либо элемент. Затем вы хотите иметь возможность вызвать конструктор из этого элемента. Суть этого в том, что указатели указывают на объекты, но я спрашиваю, возможно ли, чтобы они указывали на фактический класс или делали что-то с аналогичной функцией. Видя, как это объяснение может показаться немного запутанным, позвольте мне уточнить код.
В этом примере для простоты будет использоваться 3 элемента, а не 10
class A //the base class
{
public:
int x,y;// inherited values
virtual void render() = 0;// thats right its an abstract class
};
A * basePointer = NULL;
class a0: public A
{
public:
a0()
{
//do stuff
}
void render()
{
//do render stuff
}
}
class a1: public A
{
public:
a1()
{
//do different stuff
}
void render()
{
//do different render stuff
}
}
class a2: public A
{
public:
a2()
{
//do even more stuff
}
void render()
{
//do even more render stuff
}
}
mainloop()
{
//handle events and get mouse position
for(int i = 0;i < 3;i++)//3 being the number of non-absract classes
{
if(a[i].x = mousePos.x && a[i].y = mousePos.y)
{
basePointer = new a[i]
}
}
}
Я понимаю, что попытка ссылаться на a1, a2 и a3 с помощью [i], а цикл был глупым, но я надеюсь, что это поможет вам понять, что я пытаюсь сделать. Любую помощь помогает или ободряют предложения.
Типичный способ достижения этого - это " клонирование " или другая форма шаблона Factory.
В базовом классе можно добавить чистый виртуальный метод Clone
, позволяющий каждому объекту клонировать себя.
class A //the base class
{
public:
int x,y;// inherited values
virtual void render() = 0;// thats right its an abstract class
virtual std::unique_ptr<A> Clone() = 0;
};
Типичное переопределение довольно просто:
//In class a1
virtual std::unique_ptr<A> Clone()
{
auto clone = new a1();
clone->x = x;
clone->y = y;
return std::unique_ptr<A>(clone);
}
Написание цикла for для рендеринга и дублирования объектов тогда тривиально:
std::vector<A*> items;
items.push_back(new a0 ());
items.push_back(new a1 ());
items.push_back(new a2 ());
for(auto item : items)
{
item->render();
auto new_item = item->Clone();
// use the clone
}
Живой пример на идеоне.