C++:为指向两种类型之一的指针保留打开选项

C++: Leaving open option for a pointer to point to one of two types

本文关键字:指针 保留 选项 类型 两种 C++      更新时间:2023-10-16

在C++中,我有两个类:NodeRootNode。我想要一个Node的成员,它可以是指向NodeRootNode的指针。有没有什么方法可以让指针指向两个不同类中的一个,而不需要提交其中一个,直到我设置了指针的值?

我用union看到了一些答案;我不确定这些是否有效,因为要使用使用union定义的变量,我必须知道它是指向Node还是指向RootNode,这样我才能知道要引用union的哪个对象(union_typedef.node还是union_typedef.rootnode)。我希望能够使用这个指针,而不需要知道它指向的是Node还是RootNode

有一种方法可以做你想做的事情,也有一种方式可以做你可能需要做的事情(这两者是不同的)。

要执行您想要的操作(设置两种类型之一的指针),请使用union:

struct MyStruct {
union {
Node *nodePtr;
RootNode *rootPtr;
}
};

在上面,您可以设置nodePtrrootPtr,但并集将占用单个指针的空间。

然而,您可能需要的是一个具有虚拟函数的类继承,以及一个指向基类的指针:

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的指针,并为其指定一个指向NodeRootNode的指针。无论您分配什么,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;

NodeRootNode都不是从另一个派生的。

如果派生层次结构是固定的,并且您不能更改它,那么您可以为NodeRootNode构建包装器类,让一个包装器从另一个派生(或者让它们都从一个共同的祖先派生),并生成分派到被包装对象的函数的虚拟函数。

当然。使用工会!

union { Node *nodePtr; RootNode *rootNodePtr; } unionNodePtr;

RootNode是否派生自Node,反之亦然?

如果是,那么只需将您的成员声明为哪种类型是"基"类型。例如:

class Node
{
public:
Node *member;
};
class RootNode : public Node
{
};

如果没有,您将不得不使用union

class RootNode
{
};
class Node
{
public:
union {
RootNode *root;
Node *node;
} member;
};