成员包含其他继承类的继承类?

Inherited class with member containing other inherited classes?

本文关键字:继承 包含 成员 其他      更新时间:2023-10-16

我试图用C++表示一个抽象的语法树。 我有多个继承基类"树节点"的类。 其中一些包含指向其他继承的 TreeNode 类的指针。 使用我尝试使用它的方法,我似乎无法访问子树节点中的成员。我做错了什么吗?有没有更好的方法来实现这一目标?

class TreeNode {};
class UnaryOperation : virtual public TreeNode {
public:
TreeNodeType Type;
UnaryOperationType Operation;
TreeNode* Operand;
UnaryOperation(UnaryOperationType operation, TreeNode* operand);
};
class BinaryOperation : virtual public TreeNode {
public:
TreeNodeType Type;
TreeNode* Left;
BinaryOperationType Operation;
TreeNode* Right;
BinaryOperation(TreeNode* left, BinaryOperationType operation, TreeNode* right);
};

TreeNode* unaryop_node = new UnaryOperation(op_type, operand_node);
return unaryop_node;

std::cout << (int)*unaryop->Type << std::endl;

类树节点没有成员类型

感谢您的所有回答。 事实证明,我试图以错误的方式解决这个问题。我完全删除了TreeNodeType枚举,而是使用虚函数遍历树。

class TreeNode {
public:
TreeNode();
virtual void print() = 0;
};
class UnaryOperation : public TreeNode {
public:
UnaryOperationType Operation;
TreeNode* Operand;
UnaryOperation(UnaryOperationType operation, TreeNode* operand);
void print() override {
print_unaryop(Operation);
Operand->print();
}
};
class BinaryOperation : public TreeNode {
public:
TreeNode* Left;
BinaryOperationType Operation;
TreeNode* Right;
BinaryOperation(TreeNode* left, BinaryOperationType operation, TreeNode* right);
void print() override {
Left->print();
print_binaryop(Operation);
Right->print();
}
};```
`unaryop_node->print();`

作为一般说明,在C++中,当您具有指向某个类型的指针时,您只能访问该特定类型具有的成员/函数; 您无权访问派生类中的任何成员/函数(直接(; 这仅适用于例如通过强制转换或虚函数。

从您尝试通过TreeNode指针访问创建的UnaryOperation的方式来看,看起来Type应该是基类TreeNode的一部分,如下所示:

class TreeNode {
public:
TreeNodeType Type;
};
class UnaryOperation : virtual public TreeNode {
public:
UnaryOperationType Operation;
TreeNode* Operand;
UnaryOperation(UnaryOperationType operation, TreeNode* operand);
};
class BinaryOperation : virtual public TreeNode {
public:
TreeNode* Left;
BinaryOperationType Operation;
TreeNode* Right;
BinaryOperation(TreeNode* left, BinaryOperationType operation, TreeNode* right);
};

这假设TreeNodeType表示节点的类型,例如对于类型UnaryOperation的所有实例都是相同的;它可以定义为类似

enum TreeNodeType { UnaryOp, BinaryOp };

请注意,在 C++ 的基类中需要这样的"类型指示器"通常是一种代码气味,表明您没有按照 C++ 中应该完成的方式进行继承 - 通常您不需要区分 TreeNode 中包含的不同派生类型(因为您调用的虚函数会自动执行泛型基指针中包含的特定子类型所需的操作(, 或者,您应该有一个指向特定类的指针。