创建具有此类类型属性的类 + 对其他类的继承(Node 类和 ModelL)

Posted

技术标签:

【中文标题】创建具有此类类型属性的类 + 对其他类的继承(Node 类和 ModelL)【英文标题】:Creating a class with attributes of this class type + inheritance to other class (Node classs and NodeAVL) 【发布时间】:2020-03-31 19:28:37 【问题描述】:

我正在尝试执行以下代码:

class Node

    protected:
        int *value;
        Node *leftChild;
        Node *rightChild;
        friend class BST;

    public:
        Node(int value = 0);
        virtual ~Node();
        virtual int info();
;

Node::Node(int value) : leftChild(nullptr), rightChild(nullptr) 
    this->value = new int(value);
    std::cout << "Creating the node " << *(this->value) << "\n";


class NodeAVL : public Node

    private:
        friend class AVL;
    public:
        int *balanceFactor;
        NodeAVL(int value = 0);
        virtual ~NodeAVL();
;

NodeAVL::NodeAVL(int value) : Node(value) 
    this->balanceFactor = new int(0);
    std::cout << "Creating the AVL node " << *(this->value) << " with balance factor " << *(this->balanceFactor) << "\n";

现在,我的问题是我应该派生NodeAVL(强制),而我对Node类(基类)有问题,因为有Node *leftChildNode *rightChild的声明,当我创建一个AVL节点,它创建其类型为Node* 的子节点。如何使用NodeAVL* 类型创建它? 或者我怎样才能创建一个 T 类:

class T
    T* leftChild;
    T* rightChild;

所以我会让Node 类有Node 孩子和NodeAVL 派生自NodeNodeAVL 孩子?

【问题讨论】:

【参考方案1】:

既然你已经用多态标记了你的帖子,我会给你一个基于运行时多态的答案。你没有。

运行时多态性的部分要点是,从基类派生的对象可以传递并存储为作为基类的对象,同时仍保留其覆盖功能(是的,切片是一个问题,但我们在这里处理指针)。因此,您不需要将Node 更改为NodeAVL,只需将leftChildrightChild 设置为指向NodeAVL 的对象而不是Node 就足够了,任何覆盖的方法都会调用该方法NodeAVL.

无论如何,您都将节点设置为 nullptr,但如果您不这样做,那么您可以创建一个 Node 构造函数,它接受 leftChildrightChild 的指针(可能使其受到保护,因此只有派生类可以使用它)。

作为旁注,请使用您的初始化列表设置value,而不是事后设置。也更喜欢智能指针而不是裸指针。

【讨论】:

好吧,我同意你的看法。但问题是,如果我尝试从 NodeAVL 更改 balanceFactor 的值,如果 leftChild 或 rightChild 是 Node* 类型,我就不能。 在这种情况下,您还没有实现多态基类,就像我在开头所说的那样,这个答案假设您正在使用运行时多态性。如果NodeAVL 是-a(公共继承的意思)Node,那么它必须至少具有与Node 相同的属性,更改其中一个属性的类型意味着@987654336 @ 不再可用作Node 好的,但是有没有办法让 NodeAVL 成为 Node 类型,但让子节点成为 NodeAVL 类型,正如我在问题中所问的那样? 没有。您不能从一个类派生并更改其成员的类型。就像我上面所说的那样,首先完全打破了继承的想法,重新设计你的代码。您可以使用模板执行此操作,除非您尝试存储然后模板化的类的成员(模板本身),当您尝试声明它的类型时会导致无休止的循环。 (模板不会破坏继承,因为您从父级的特定形式继承) 那你能帮我做模板吗?我不是很喜欢他们

以上是关于创建具有此类类型属性的类 + 对其他类的继承(Node 类和 ModelL)的主要内容,如果未能解决你的问题,请参考以下文章

获取从抽象类继承并在属性中具有特定值的类的实例

引用泛型类型的类属性

具有 UIView 继承类的 UIViewController,以编程方式

Java 继承

java面向对象

Java面向对象