成员包含其他继承类的继承类?
Inherited class with member containing other inherited classes?
我试图用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 中包含的不同派生类型(因为您调用的虚函数会自动执行泛型基指针中包含的特定子类型所需的操作(, 或者,您应该有一个指向特定类的指针。
相关文章:
- 成员包含其他继承类的继承类?
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 当子类需要在 c++ 中相互包含时,继承有缺陷
- cppyy 继承包含智能指针的类
- 继承一个类,该类继承另一个已包含的类
- 在派生类的成员联合中包含继承的基类成员
- python永远不能调用包含继承逻辑的c++dll或左右文件
- 从 std::enable_shared_from_this 继承的自身自包含shared_ptr
- 将 Makefile 包含在 qmake 中,继承属性
- 派生类是否C++必须在头文件中包含继承函数/成员的定义
- 如何使数组包含从基类继承的类
- 包含在 C++ 中的继承中
- 在 main 中包含基类和继承类的标头
- 一个包含类、继承和多态性的谜语
- C++.子项继承自“父项”,并作为“父级”属性包含在内
- 当基类不包含数据成员时,虚拟继承是否仍然是必要的
- 继承还是包含?C++
- 如何在继承boost::any中包含的std::vector的类上循环
- C++:包含继承、多态性和工厂
- 包含带有层次继承的错误