如何访问存储在父类中的子类成员

How can I access a child class member stored in a parent class?

本文关键字:父类 子类 成员 存储 何访问 访问      更新时间:2023-10-16

我被指派创建一个稀疏矩阵。在这个过程中,我遇到了一个问题。我意识到我无法访问存储在父类中的子类的成员。

"谷歌"了我的问题,我得到的是有一些选角问题。我试过了,也没有用。

示例代码:

主.cpp

#include <iostream>
template <typename T>
class Node
{
public:                     // public for example purposes
    Node<T> *down, *right;
public:
    explicit Node(Node<T> *d, Node<T> *r) : down(d), right(r) {}
};
template <typename T>
class HNode : public Node<T>
{
private:
    unsigned idxValue;
public:
    HNode(unsigned iv) : idxValue(iv), Node<T>(nullptr, nullptr) {}
};
template <typename T>
class ENode : public Node<T>
{
public:                     // public for example purposes
    unsigned row;
    unsigned col;
    int value;
public:
    ENode(unsigned r, unsigned c, int v) : row(r), col(c), value(v), Node<T>(nullptr, nullptr)
    {}
};
int main(void)
{
    Node<int> *root;
    root = new Node<int>(nullptr, nullptr);
    root->right = new HNode<int>(0);
    root->down = new HNode<int>(0);
    root->right->down = new ENode<int>(0, 0, 10);

    std::cout << root->right->down->value << 'n';
}

这是我得到的错误:

error: no member named 'value' in 'Node<int>'
std::cout << root->right->down->value << 'n';

root是一个节点指针。 root->right是另一个节点指针。 root->right->down - 你猜对了 - 一个Node指针。

当你执行[...]->value时,你正在取消引用该节点指针,它给你一个节点,然后尝试获取value成员。但是节点没有value成员!

您可以尝试使用动态强制转换将节点指针强制转换为 ENode 指针。看起来像:

Node *n = root->right->down;
if(ENode *en = dynamic_cast<ENode*>(n)) {
    std::cout << en->value << std::endl;
} else {
    std::cout << "That's not an ENode!" << std::endl;
}

但要做到这一点,你需要使 Node 多态(你可以在这里看到详细的内容(。

另请注意,在生产代码中,您应该检查以确保rootroot->rightroot->right->down 都是非空的,然后再继续取消引用它们。

Node只有指向其他Node的指针,它不知道它们可能是什么派生类。

"通常"最好在基类中使用正确的接口,以便从不同类型的派生类中获取结果/值。

例如,如果你有一个基类动物:

class animal
{
    virtual int number_of_limbs() = 0;
}

然后派生的类 pig:

class pig: public animal
{
   int number_of_limbs() override { return 3;}
}

通过这样做,类的"接口"是通用的,但每个派生/专用化都可以具有特定的值。

在您的情况下,您可能只需要在基类中名为 virtual int get_value() 的函数,然后在ENode类中实现它......

(注意上面的所有代码都是伪代码(