私の質問は、nullptr
にあるderivedClassA
の方法で初期化されているので、基本クラスのコンストラクタを呼び出すかどうかです。コードは期待どおりに動作しますが、それでもまだ間違っています。基本クラスのコンストラクタを呼び出す派生クラスのコンストラクタ
長さのために、私はクラスTree
から派生している他のクラスを省略しているが、ここでの考え方は、あなたが派生クラスの任意の数を持つツリーオブジェクトを作成し、getStringExpression()
を呼び出すことができるということであり、それが何であれgetStringExpression返します。に評価する。たとえば、Tree
のオブジェクトに、DerivedClassA
のオブジェクトへのポインタが含まれていて、右の子と左の子が「Car」と「Ride」に等しい場合、Tree.getStringExpression();
は「(Car + Ride)」を返します。それぞれのgetStringExpression()
メソッドが呼び出されたとき(子がないとき)にそれぞれ文字列 "Car"と "Ride"を返すTreeから派生した具象クラスによってCarとRideの値が返されたとします。
derivedClassAの単一のオブジェクトを作成すると、このオブジェクトはその構築中に作成された2つの子ノードを持つルートノードになるため、derivedClassAの場合と同様にnullptrに基本クラスのコンストラクタを初期化するのは間違いです。このシナリオでは、構築された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;
}
私はTreeを別のクラスにすることになり、binaryNode抽象クラスに相当するものを作りました。ツリーは、バイナリノード派生クラスへのポインタで構築されます – LBaelish