创建具有此类类型属性的类 + 对其他类的继承(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 *leftChild
和Node *rightChild
的声明,当我创建一个AVL节点,它创建其类型为Node*
的子节点。如何使用NodeAVL*
类型创建它?
或者我怎样才能创建一个 T 类:
class T
T* leftChild;
T* rightChild;
所以我会让Node
类有Node
孩子和NodeAVL
派生自Node
有NodeAVL
孩子?
【问题讨论】:
【参考方案1】:既然你已经用多态标记了你的帖子,我会给你一个基于运行时多态的答案。你没有。
运行时多态性的部分要点是,从基类派生的对象可以传递并存储为作为基类的对象,同时仍保留其覆盖功能(是的,切片是一个问题,但我们在这里处理指针)。因此,您不需要将Node
更改为NodeAVL
,只需将leftChild
或rightChild
设置为指向NodeAVL
的对象而不是Node
就足够了,任何覆盖的方法都会调用该方法NodeAVL
.
无论如何,您都将节点设置为 nullptr
,但如果您不这样做,那么您可以创建一个 Node
构造函数,它接受 leftChild
和 rightChild
的指针(可能使其受到保护,因此只有派生类可以使用它)。
作为旁注,请使用您的初始化列表设置value
,而不是事后设置。也更喜欢智能指针而不是裸指针。
【讨论】:
好吧,我同意你的看法。但问题是,如果我尝试从 NodeAVL 更改 balanceFactor 的值,如果 leftChild 或 rightChild 是 Node* 类型,我就不能。 在这种情况下,您还没有实现多态基类,就像我在开头所说的那样,这个答案假设您正在使用运行时多态性。如果NodeAVL
是-a(公共继承的意思)Node
,那么它必须至少具有与Node
相同的属性,更改其中一个属性的类型意味着@987654336 @ 不再可用作Node
。
好的,但是有没有办法让 NodeAVL 成为 Node 类型,但让子节点成为 NodeAVL 类型,正如我在问题中所问的那样?
没有。您不能从一个类派生并更改其成员的类型。就像我上面所说的那样,首先完全打破了继承的想法,重新设计你的代码。您可以使用模板执行此操作,除非您尝试存储然后模板化的类的成员(模板本身),当您尝试声明它的类型时会导致无休止的循环。 (模板不会破坏继承,因为您从父级的特定形式继承)
那你能帮我做模板吗?我不是很喜欢他们以上是关于创建具有此类类型属性的类 + 对其他类的继承(Node 类和 ModelL)的主要内容,如果未能解决你的问题,请参考以下文章