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 уже кто-то упоминал такое дизайнерское решением в котором фрукты являются подмножеством яблок. :)