在 C++ 中,我有两个类:Node
和 RootNode
。我想要一个 Node
的成员,它可以是指向 Node
或 RootNode
的指针。有什么方法可以让指针打开指向两个不同类之一的选项,而无需提交其中一个,直到我设置该指针的值?
我看到一些使用 union
的答案;我不确定这些是否有效,因为要使用使用 union
定义的变量,我必须知道它是指向 Node
还是 RootNode
所以我知道要引用哪个 union
对象(union_typedef.node
或 union_typedef.rootnode
)。我希望能够使用此指针而无需知道它是指向 Node
还是 RootNode
。
最佳答案
有一种方法可以做您想做的,也有一种方法可以做您可能需要做的(这两者是不同的)。
做你想做的事(设置两种类型之一的指针)使用union
:
struct MyStruct {
union {
Node *nodePtr;
RootNode *rootPtr;
}
};
在上面,您可以设置nodePtr
或rootPtr
,但 union 将占用单个指针的空间。
但是,您可能需要的是具有虚函数的类继承和指向基类的指针:
struct Node {
virtual void doSomething() {
cout << "I'm a node" << endl;
}
};
struct RootNode : public Node {
virtual void doSomething() {
cout << "I'm a root" << endl;
}
};
您可以创建一个指向Node
的指针,并为其分配一个指向Node
或RootNode
的指针。无论您分配什么,doSomething()
的调用都将被路由到正确的函数:
Node *n = new Node();
n->doSomething(); // Prints "I'm a node"
delete n;
n = new RootNode();
n->doSomething(); // Prints "I'm a root"
delete n;
Neither
Node
norRootNode
derive from the other.
如果派生层次是固定的,你不能改变它,你可以为 Node
和 RootNode
构建包装类,让一个包装器从另一个派生(或让它们两者都派生自一个共同的祖先),并生成分派(dispatch)给包装对象函数的虚函数。
关于C++:为指向两种类型之一的指针保留打开选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30177315/