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

标签 c++ pointers

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

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

最佳答案

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

做你想做的事(设置两种类型之一的指针)使用union:

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

在上面,您可以设置nodePtrrootPtr,但 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 的指针,并为其分配一个指向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;

Neither Node nor RootNode derive from the other.

如果派生层次是固定的,你不能改变它,你可以为 NodeRootNode 构建包装类,让一个包装器从另一个派生(或让它们两者都派生自一个共同的祖先),并生成分派(dispatch)给包装对象函数的虚函数。

关于C++:为指向两种类型之一的指针保留打开选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30177315/

相关文章:

C++ std::add_const 不能正常工作?

c - 函数中赋值的指针返回后为空

c++ - 从类调用函数时箭头 '->' 分隔符崩溃

c++ - 使用通用函数指针 C++ 传递方法所需类型的参数

c++ - C++中奇怪的循环跳转

c++ - <math.h> 是 C 还是 C++?

c++ - 推导 C++11 中 lambda 参数的类型

c++ - 模板函数无法识别由 auto 变量引用的 lambda

pointers - 为什么在 Rust 中修改字符串变量时指针地址没有改变?

c++ - 在C++的数组声明中指定元素位置