C ++将派生类的成员更改为其专门版本

时间:2018-11-20 21:31:16

标签: c++ inheritance polymorphism

假设我有两个类- Graph Vertex ,它们具有一些代表普通Graph所需的基本成员和方法。它们已经完全实现,并且可以完美地用于标准图形。

=Switch(
        Fields!DailySalesGoalPassFail.Value = 1, "Green",
        Fields!DailySalesGoalPassFail.Value = 0, "Red",
        true, "Yellow"
        )

我想扩展这些类以添加一些与问题相关的功能。例如,我想要一个存储其颜色的顶点。这就是为什么我声明另一个名为 VertexC 的类的原因,该类继承自 Vertex 并添加了一个新成员。因此,现在我想拥有一个专门版本的 Graph - GraphC ,它可以管理新的 VertexC 属性。

class Vertex { 
    int id;
    Vertex(int id) : id(id) {}
    // ...
}

class Graph {
    std::vector<Vertex *> vertices;
    void addVertex(int id) {
        vertices.push_back(new Vertex(id));
    }
    // ...
}

但是我不能这样做,因为 Graph :: vertices 的类型是 Vertex * ,而不是 VertexC * ,因此它们不会具有 getColour()方法。有什么建议可以解决这个问题吗?

编辑:稍微更改了描述以更直接地介绍我的问题。

1 个答案:

答案 0 :(得分:0)

一个选项是对Graph类进行模板化。像这样:

template<typename TVert> class Graph
{
    std::vector<TVert> vertices;
    // ...
};

这意味着可以将专业化声明为:

class GraphC : public Graph<VertexC*>
{
    // ...
};

但是可能需要对addVertex方法进行某些处理。可以这样声明:

void addVertex(int id)
{
    vertices.push_back(new TVert(id));
}

尽管这将意味着Graph类的任何特殊化都只能是包含带有单个int参数的构造函数的类型。另一种可能是:

void addVertex(TVert vert)
{
    vertices.push_back(vert);
}

还要注意在GraphC的类声明中添加了public关键字。为了使Graph的addVertex方法可通过GraphC实例使用,这是必需的。