派生类构造函数调用基类构造函数

时间:2016-03-30 20:00:28

标签: c++ inheritance polymorphism c++14

我的问题是它是否可以将基类构造函数调用为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;
}

1 个答案:

答案 0 :(得分:0)

听起来你已经合并了TreeNode的类。您正在使用单个" root"在构造函数中初始化Tree树,它应该有一个"根Node本身有两个孩子。在这种情况下,Node不会从Tree继承 - 您将拥有两个单独的类。

或许你有一个抽象的Node类和一个BinaryNode继承它来重新连接一个有两个孩子的节点,为不同的节点类型打开了大门(有两个以上子节点的节点,或者不平衡的孩子们。)

所以回答你的问题,是的,你正在初始化" base"使用默认值,但我认为这是因为您的类层次结构错误。含义derivedClassA 不是 a Tree