编辑:底部的特定示例
解释问题的最佳方法是通过示例(请注意,此特定示例的解决方案不是我要寻找的答案)。
假设我有一个基类Base
,它基本上是一个容器:
class Base {
protected:
class BaseNode {
protected:
BaseNode* next;
int id;
};
Node* head;
public:
// ... functionality
};
现在,我想派生和改进它,添加一个额外的数据字段:
class Derived : public Base {
private:
class DerivedNode: public BaseNode {
char* name;
};
public:
// .. some more functionality
};
我想要的是一个Derived
具有所有功能的类Base
,但要让每个节点都包含一个name
,而不仅仅是一个id
。
但是,如果我查看的实例DerivedNode
,我想要的是:
DerivedNode = {
DerivedNode* next;
int id;
char* name;
};
但是我拥有的是:
DerivedNode = {
BaseNode* next;
int id;
char* name;
};
因此DerivedNode()->next->name
将是不确定的!
更不用说Base
该类仅处理BaseNode
s ...对in的所有调用,new
并且delete
不会为char*
in分配足够的内存DerivedNode
。
这似乎是一个非常笼统的问题,是否有某种巧妙的方法可以解决此问题?大部分Base
s功能甚至对于DerivedNode
s都将非常有用,因此我宁愿保持继承方案不变。
编辑:这可能是有用的一个具体示例
我真的不想放很多代码,所以我会尝试解释...如果有人想看一个例子,我在这里问了一个关于我的特定需求的问题。
我正在List
上课。那是我的基础课。它是模板化的(每个节点中的数据都是模板化的,并且每个节点还具有* next和* prev字段),具有迭代器嵌套的类,插入,通过迭代器位置移除...的工作原理。
我想实现一个Forrest
类,该类是数据节点的列表(仍为模板),但是每个节点都包括一个TreeNode
指向该节点的s列表。我想这样做是因为数据是可排序的,并且我希望能够及时获取log(n)
(因此,是一棵树),但是它可以通过两种不同的方式(例如,年龄和ID号)进行排序,所以我需要两棵树指向相同的数据。
因此:我Forrest
从继承List
,并派生ForrestNode
以包含TreeNode
s的列表,该s指向数据:
class DerivedNode: public List<T>::ListNode {
List<Tree<T*>::TreeNode*> treeNodes;
};
基类List
并不需要了解新的treeNodes
领域,因为这是风马牛不相及的列表功能-类似的方法swap
,get_head
,is_empty
应该工作一样,并创建一个新的节点应该工作几乎相同(需要分配更多的内存,但是新treeNodes
字段绝对不能使用数据初始化)。
Forrest
但是,新类将覆盖baseList
的方法,但仅具有附加功能-例如,在插入(常规列表插入)之后,将指针插入相关树,然后新树节点的地址将被添加到treeNodes
列表中。
您可以简单地将Base :: BaseNode转换为模板,并提供next
成员变量的类型作为type参数,如下所示:
class Base {
protected:
template <class Derived>
class BaseNode {
protected:
Derived* next;
int id;
};
Node* head;
public:
// ... functionality
};
class Derived : public Base {
private:
class DerivedNode: public BaseNode<DerivedNode> {
char* name;
};
public:
// .. some more functionality
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句