成员包含其他继承类的继承类? 我试图用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); };

成员包含其他继承类的继承类? 我试图用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); };,c++,class,pointers,inheritance,abstract-syntax-tree,C++,Class,Pointers,Inheritance,Abstract Syntax Tree,STD::CUTHORT类型作为一般注释,在C++中,当您有指向某个类型的指针时,只能访问该特定类型具有的成员/函数;您无权访问派生类中的任何成员/函数(直接);这只能通过铸造或虚拟功能来实现 从您试图通过TreeNode指针访问创建的UnaryOperation的方式来看,Type应该是基类TreeNode的一部分,类似于: class TreeNode { public: TreeNodeType Type; }; class UnaryOperation : virtual pu


<代码> STD::CUTHORT类型

作为一般注释,在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++中做继承的方式——通常你也不需要区分包含在树型中的不同派生类型。(因为您调用的虚拟函数会自动执行泛型基指针中包含的特定子类型所需的操作),或者您应该有一个指向特定类的指针。

谢谢您的回答。 原来我试图以错误的方式解决这个问题。我完全删除了
TreeNodeType
enum,而是使用虚拟函数遍历树

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();`

嗯,编译器是对的-
TreeNode
没有这样的成员。为什么不将
Type
移动到基类,因为它适用于所有节点?是的,我想我可以。但是因为它是一个单字节操作,它会不会没有member
Type
单字节操作
有成员
Type
,但是
单字节操作op_node
是一个(指向)
TreeNode
的指针,它没有任何
类型
。这是否回答了您的问题?如何使BinaryOperation类中的
Left
Right
接受任何继承的类?
enum TreeNodeType { UnaryOp, BinaryOp };
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();`