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

Derived class constructor calling base class constructor

本文关键字:基类 构造函数 函数调用 派生      更新时间:2023-10-16

我的问题是,是否可以像下面在derivedClassA中那样,将基类构造函数初始化为nullptr。代码按预期工作,但仍然感觉不对。

为了长度起见,我省略了从类Tree派生的其他类,但这里的想法是,您可以创建一个具有任意数量派生类的Tree对象,并调用getStringExpression(),它将返回getStringExpression的计算结果。例如,如果Tree类型的对象包含指向DerivedClassA对象的指针,其左右子项等于"Car"answers"Ride",则Tree.getStringExpression();将返回"(Car+Ride)"。假设值Car和Ride是由Tree派生的具体类返回的,当调用它们的getStringExpression()方法时,这些类分别返回字符串"Car"answers"Ride"(并且它们没有子级)。

像我在derivedClassA中那样将基类构造函数初始化为nullptr感觉是错误的,因为如果我创建了derivedCClassA的单个对象,那么这个对象就是根节点,它的两个子节点在构造过程中创建。在这种情况下,构建的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;
}

听起来像是合并了TreeNode的类。您正在用一个"根"树初始化构造函数中的Tree,而它应该有一个本身有两个子级的"根Node"。在这种情况下,Node不会从Tree继承-您将有两个独立的类。

或者,您有一个抽象的Node类和一个继承它的BinaryNode来表示具有两个子节点的节点,从而为不同的节点类型(具有两个以上子节点或不平衡子节点)打开了大门。

所以,为了回答你的问题,是的,你用默认值初始化"基"似乎很奇怪,但我认为这是因为你的类层次结构是错误的。意味着derivedClassA不是Tree