![](/img/trans.png)
[英]How can I access the member variables of parent class from child class in c++?
[英]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多態(您可以在此處查看詳細信息 )。
還要注意,在生產代碼中,應先檢查root
, root->right
和root->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.