【问题标题】:Derived class constructor calling base class constructor派生类构造函数调用基类构造函数
【发布时间】: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


    【解决方案1】:

    听起来你已经合并了TreeNode 的类。您正在使用单个“根”树在构造函数中初始化Tree,此时它应该有一个“根Node”,它本身有两个孩子。在这种情况下,Node 不会从Tree 继承 - 你会有两个单独的类。

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

    所以要回答您的问题,是的,您使用默认值初始化“基础”似乎很奇怪,但我认为这是因为您的类层次结构错误。含义 derivedClassA 不是 Tree

    【讨论】:

    • 这听起来怎么样 - 我最终将 Tree 完全设为一个单独的类,并制作了相当于 binaryNode 抽象类的类。树是用一个指向二进制节点派生类的指针构造的
    猜你喜欢
    • 2018-07-21
    • 2015-08-18
    • 2018-07-16
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2012-11-06
    • 2011-05-03
    相关资源
    最近更新 更多