我的问题是它是否可以将基类构造函数调用为nullptr
,就像derivedClassA
中的Tree
一样。代码按预期工作,但仍然感觉不对。
为了长度,我省略了从类getStringExpression()
派生的其他类,但这里的想法是你可以创建一个具有任意数量的派生类的Tree对象,并调用{{1}并且它将返回getStringExpression求值的任何内容。例如,如果类型为Tree
的对象包含指向DerivedClassA
对象的指针,该对象的右边和左边的子节点等于" Car"和"骑"然后Tree.getStringExpression();
将返回"(Car + Ride)"。假设Car和Ride的值由从Tree派生的具体类返回,返回字符串" Car"和"骑"分别调用他们的getStringExpression()
方法时(他们没有孩子)。
将我的基类构造函数初始化为nullptr是错误的,因为如果我创建了derivedClassA的单个对象,那么这个对象就是在构造过程中创建了两个子节点的根节点。在这种情况下,构造的Tree
会发生什么?由于它的指针是nullptr,它并没有真正被使用,或者它与derivedClassA
的对象断开或不相关...
我提前道歉,因为我知道这不是最直接的问题。
tree.h中 -
class Tree
{
public:
explicit Tree(Tree *rootNode);
virtual ~Tree() {};
virtual std::string getStringExpression() const;
private:
Tree *rootNodePtr = nullptr;
};
Tree.cpp -
#include "Tree.h"
Tree::Tree(Tree *rootNode)
{
rootNodePtr = rootNode;
}
std::string Tree::getStringExpression() const
{
if(rootNodePtr != nullptr)
{
return rootNodePtr->getStringExpression();
}
return "Tree has no children";
}
derivedClassA.h -
#include "Tree.h"
class derivedClassA :
public Tree
{
public:
derivedClassA(Tree *leftChild, Tree *rightChild);
virtual ~derivedClassA();
virtual std::string getStringExpression() const override;
private:
Tree *leftChildPtr = nullptr;
Tree *rightChildPtr = nullptr;
};
derivedClassA.cpp -
#include "derivedClassA.h"
derivedClassA::derivedClassA(Tree *leftChild, Tree *rightChild): Tree(nullptr)
{
leftChildPtr = leftChild;
rightChildPtr = rightChild;
}
derivedClassA::~derivedClassA()
{
}
std::string derivedClassA::getStringExpression() const
{
auto expressionValue = "(" + leftChildPtr->getStringExpression() + "+" + rightChildPtr->getStringExpression() + ")";
return expressionValue;
}
答案 0 :(得分:0)
听起来你已经合并了Tree
和Node
的类。您正在使用单个" root"在构造函数中初始化Tree
树,它应该有一个"根Node
本身有两个孩子。在这种情况下,Node
不会从Tree
继承 - 您将拥有两个单独的类。
或许你有一个抽象的Node
类和一个BinaryNode
继承它来重新连接一个有两个孩子的节点,为不同的节点类型打开了大门(有两个以上子节点的节点,或者不平衡的孩子们。)
所以回答你的问题,是的,你正在初始化" base"使用默认值,但我认为这是因为您的类层次结构错误。含义derivedClassA
不是 a Tree
。