如何在嵌套类中实现多态?

喜欢

编辑:底部的特定示例

解释问题的最佳方法是通过示例(请注意,此特定示例的解决方案不是我要寻找的答案)。

假设我有一个基类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该类仅处理BaseNodes ...in的所有调用,new并且delete不会为char*in分配足够的内存DerivedNode

这似乎是一个非常笼统的问题,是否有某种巧妙的方法可以解决此问题?大部分Bases功能甚至对于DerivedNodes都将非常有用,因此我宁愿保持继承方案不变。

编辑:这可能是有用的一个具体示例

我真的不想放很多代码,所以我会尝试解释...如果有人想看一个例子,我在这里问了一个关于我的特定需求的问题

我正在List上课。那是我的基础课。它是模板化的(每个节点中的数据都是模板化的,并且每个节点还具有* next和* prev字段),具有迭代器嵌套的类,插入,通过迭代器位置移除...的工作原理。

我想实现一个Forrest类,该类是数据节点的列表(仍为模板),但是每个节点都包括一个TreeNode指向该节点s列表我想这样做是因为数据是可排序的,并且我希望能够及时获取log(n)(因此,是一棵树),但是它可以通过两种不同的方式(例如,年龄和ID号)进行排序,所以我需要两棵树指向相同的数据。

因此:我Forrest从继承List,并派生ForrestNode以包含TreeNodes的列表,该s指向数据:

class DerivedNode: public List<T>::ListNode {
    List<Tree<T*>::TreeNode*> treeNodes;
};

基类List并不需要了解新的treeNodes领域,因为这是风马牛不相及的列表功能-类似的方法swapget_headis_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章