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