派生类构造函数调用基类构造函数
Derived class constructor calling base class constructor
我的问题是,是否可以像下面在derivedClassA
中那样,将基类构造函数初始化为nullptr
。代码按预期工作,但仍然感觉不对。
为了长度起见,我省略了从类Tree
派生的其他类,但这里的想法是,您可以创建一个具有任意数量派生类的Tree对象,并调用getStringExpression()
,它将返回getStringExpression的计算结果。例如,如果Tree
类型的对象包含指向DerivedClassA
对象的指针,其左右子项等于"Car"answers"Ride",则Tree.getStringExpression();
将返回"(Car+Ride)"。假设值Car和Ride是由Tree派生的具体类返回的,当调用它们的getStringExpression()
方法时,这些类分别返回字符串"Car"answers"Ride"(并且它们没有子级)。
像我在derivedClassA中那样将基类构造函数初始化为nullptr感觉是错误的,因为如果我创建了derivedCClassA的单个对象,那么这个对象就是根节点,它的两个子节点在构造过程中创建。在这种情况下,构建的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
和Node
的类。您正在用一个"根"树初始化构造函数中的Tree
,而它应该有一个本身有两个子级的"根Node
"。在这种情况下,Node
不会从Tree
继承-您将有两个独立的类。
或者,您有一个抽象的Node
类和一个继承它的BinaryNode
来表示具有两个子节点的节点,从而为不同的节点类型(具有两个以上子节点或不平衡子节点)打开了大门。
所以,为了回答你的问题,是的,你用默认值初始化"基"似乎很奇怪,但我认为这是因为你的类层次结构是错误的。意味着derivedClassA
不是Tree
。
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 在成员构造函数之后调用基类构造函数
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 如何在 C++ 中将参数传递给基类构造函数
- 将数据成员的指针传递给基类构造函数是否安全?
- 使用基类构造函数初始化儿童类
- 使用基类构造函数的子类构造函数的大纲定义
- MSVC 无法识别继承模板类的模板类的"直接"基类构造函数
- 子类的构造函数后跟冒号后的基类构造函数是什么意思?
- 是否可以使用基类构造函数通过派生类将值初始化为基类私有成员?
- 当派生类无法轻易将参数传递到基类时,如何调用基类构造函数
- 是否可以在运行时切换到不同的基类构造函数?
- 对基类构造函数的未定义引用
- 如何为基类构造函数中的每个子类执行特定任务
- 将类传递到基类构造函数的模板参数中?
- 如何在基类构造函数中使用派生类成员
- (为什么)纯虚拟派生类中是否需要虚拟基类构造函数调用?
- 使用相同的参数调用基类C++构造函数