我有一个模板节点,它返回 T 类型的数据。
template <class T> Node
{
public:
virtual const T& GetData() = 0;
};
我希望派生类 RefNode 和 ValueNode 包含指向数据的指针和实际数据。这样我就可以选择是使用数据副本还是使用节点中的实际数据。
template<class T> class RefNode : public Node<T>
{
public:
RefNode(T *_data) : data(_data) { }
const T& GetData() { return *data; }
protected:
DataType *data;
};
template<class T> class ValueNode : public Node<T>
{
public:
ValueNode(const T&_data) : data(_data) { }
const T& GetData() { return data; }
protected:
T data;
};
我知道模板不能有虚方法,但我只是想说明我想要得到的效果。我想要得到的效果是:
//对于类向量
Vector v, *c;
c = new Vector();
Node<Vector>* node = new RefNode<Vector>(c);
Node<Vector>* node2 = new ValueNode<Vector>(a);
node2->GetData(); //calls ValueNode<Vector>'s GetData();
node->GetData(); //calls RefNode<Vector>'s GetData();
C++ 中有什么方法可以实现这种行为吗?
编辑:
我会像这样使用 GetData() :
Vector *vecarr[9];
Node<Vector>* nodes[10];
nodes[0] = new RefNode<Vector>(vecarr[0]);
nodes[1] = new ValueNode<Vector>(Vector(2,3)); //non reference vector
nodes[2] = new RefNode<Vector>(vecarr[1]);
nodes[3] = new RefNode<Vector>(vecarr[2]);
.....
void processPositionNodes(Node<Vector> **nodes, int n)
{
for(int i=0; i< n; i++) //iterate over all nodes
{
Vector vec = nodes[i]->GetData();
//do something with vec
}
}
我希望能够更改节点包含的数据类型,因为我想实现几种处理不同类型数据的图形算法,(向量,标量..)