2
kuragaЦитата:
ведь элементом вектора будет Vertice?
Да, но ненастоящий. Приведением типов вы к такой вершине сможете обращаться как к помеченной. Это и называется полиморфизм!
Цитата:
Сорри, я только не врубился, это в продолжение шаблонам или в замену?
В замену. :) Я просто хотел сказать, что код, приведенный в самом начале темы можно вылечить просто изменением семантики (пишем код не прикасаясь к клавиатуре -- верх искусства программирования).
Вот ваш оригинальный фрагмент:
class Vertice {};
class MarkedVertice : Vertice {};
class Graph {
std::vector<Vertice*> v;
};
class MarkedGraph : Graph {
std::vector<MarkedVertice*> v;
};
Я предлагал его изменить так:
class Vertex { ... };
class Mark {int VertexLabel; ... };
class Graph
{
std::vector<Vertex*> Vertices;
...
};
class MarkedGraph: public Graph
{
std::vector<Mark*> Labels;
...
void AddVertex(...)
{
Vertices.push_back(...);
Labels.push_back(...);
...
}
}
Видите, вершины и метки хранятся отдельно (конструкторы по-умолчанию могут пока отдыхать). Но возникает проблема с "целостностью данных" -- множества вершин и множества меток приходится обрабатывать синхронно как одно целое, даже если и хочется перевалить эту задачу на внутренние шестеренки ООП (может быть это и можно сделать). Впрочем, прямая реализация абстракции "граф" сама по себе сталкивается с похожей проблемой целостности -- приходится "синхронизировать" операции с вершинами и ребрами.
P.S.: И снова обращаю ваше внимание на некоторое несоответствие модели и предметной области; на dxdy уже кто-то упоминал такое дизайнерское решением в котором фрукты являются подмножеством яблок. :)