簡體   English   中英

如何訪問存儲在父類中的子類成員?

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

我被分配創建一個稀疏矩陣。 在這個過程中,我遇到了一個問題。 我意識到我無法訪問存儲在父類中的子類的成員。

我“搜尋”了我的問題,發現有一些鑄造問題。 我嘗試了一下,也沒有用。

樣例代碼:

main.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是Node指針。 root->right是另一個Node指針。 root->right->down是-您猜到了-一個Node指針。

當您執行[...]->value ,您將取消引用該Node指針,從而為您提供一個Node,然后嘗試在其上獲取value成員。 但是Node沒有value成員!

可以嘗試使用動態轉換將Node指針轉換為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都為非null,然后再取消引用。

根類Node僅具有指向其他Node的指針,它不知道它們可能是什么派生類。

通常,最好在基類中具有正確的接口,以從不同種類的派生類中獲取結果/值。

因此,例如,如果您有一個基類動物:

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

然后派生類豬:

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

通過這樣做,該類的“接口”是通用的,但是每個派生/專業化都可以具有其特定的值。

在您的情況下,您可能只需要在基類中調用一個名為virtual int get_value()的函數,然后在您的ENode類中實現該ENode

(請注意,以上所有代碼僅是偽代碼)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM