【发布时间】:2016-07-19 00:46:52
【问题描述】:
我的问题是是否可以将基类构造函数调用为初始化为nullptr,就像我在derivedClassA 中的方式一样。代码按预期工作,但仍然感觉不对。
为了篇幅的缘故,我省略了从类 Tree 派生的其他类,但这里的想法是您可以创建一个具有任意数量派生类的 Tree 对象,并调用 getStringExpression() 它会返回 getStringExpression 的计算结果。例如,如果Tree 类型的对象包含指向DerivedClassA 对象的指针,该对象的左右子节点等于“Car”和“Ride”,则Tree.getStringExpression(); 将返回“(Car + Ride)” .假设值 Car 和 Ride 由派生自 Tree 的具体类返回,当它们的 getStringExpression() 方法被调用(并且它们没有子级)时,它们分别返回字符串“Car”和“Ride”。
用我在derivedClassA 中的方式将基类构造函数初始化为nullptr 感觉不对,因为如果我创建一个派生类A 的单个对象,那么这个对象就是根节点及其在构造过程中创建的两个子节点。在这种情况下,构造的 Tree 会发生什么?由于它的指针是 nullptr 它并没有真正被使用,或者它与derivedClassA 的对象有点断开或不相关...
我提前道歉,因为我知道这不是最直接的问题。
树.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;
}
【问题讨论】:
标签: c++ inheritance polymorphism c++14