Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 派生类构造函数调用基类构造函数_C++_Inheritance_Polymorphism_C++14 - Fatal编程技术网

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

C++ 派生类构造函数调用基类构造函数,c++,inheritance,polymorphism,c++14,C++,Inheritance,Polymorphism,C++14,我的问题是,是否可以调用基类构造函数,将其初始化为nullptr,就像我在下面的derivedClassA中所做的那样。代码按预期工作,但仍然感觉不正确 出于长度考虑,我省略了从classTree派生的其他类,但这里的想法是,您可以创建一个具有任意数量派生类的树对象,并调用getStringExpression(),它将返回getStringExpression计算结果的任何值。例如,如果类型为Tree的对象包含指向DerivedClassA对象的指针,该对象的左右子级等于“Car”和“Ride

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

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

以我在derivedClassA中的方式将基类构造函数初始化为null ptr感觉是错误的,因为如果我创建derivedClassA的单个对象,那么这个对象就是根节点,在其构造过程中创建了两个子节点。在这种情况下,构建的
树会发生什么情况?因为它的指针是nullptr,所以它并没有真正被使用,或者它与
derivedClassA
的对象有点断开连接或不相关

我提前道歉,因为我知道这不是最直接的问题

树-

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;
}

听起来好像您已经合并了
节点
的类。您正在使用单个“根”树在构造函数中初始化
,此时它应该有一个自身有两个子节点的“根
节点”
。在这种情况下,
节点
将不会继承自
——您将拥有两个独立的类

或者,您可能有一个抽象的
节点
类和一个继承该类的
二进制节点
,以重新定义具有两个子节点的节点,从而为不同的节点类型(具有两个以上子节点的节点或不平衡子节点)打开了大门


因此,要回答您的问题,是的,您正在初始化“基”似乎很奇怪“使用默认值,但我认为这是因为您的类层次结构错误。意思是
derivedClassA
不是一个

这个声音是怎么回事?我最终把树变成了一个单独的类,我把它变成了一个相当于binaryNode的抽象类。树是用指向二进制节点派生类的指针构造的