假设我有两个类- 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()方法。有什么建议可以解决这个问题吗?
编辑:稍微更改了描述以更直接地介绍我的问题。
答案 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实例使用,这是必需的。