如何访问存储在父类中的子类成员
How can I access a child class member stored in a parent class?
我被指派创建一个稀疏矩阵。在这个过程中,我遇到了一个问题。我意识到我无法访问存储在父类中的子类的成员。
我"谷歌"了我的问题,我得到的是有一些选角问题。我试过了,也没有用。
示例代码:
主.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 多态(你可以在这里看到详细的内容(。
另请注意,在生产代码中,您应该检查以确保root
、root->right
和 root->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
类中实现它......
(注意上面的所有代码都是伪代码(
相关文章:
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- C++ 将子类的对象添加到父类的向量中
- 为什么我的子类不继承父类的字符串?
- 文本冒险游戏 - 如何区分一种项目类型与另一种项目类型以及如何构建项目类/子类
- Arduino在子类中使用父类方法
- 如何调用传递给 JNI 'jobject' 的 Java 对象的子类/子类的方法
- 模型类/子类,其中子类类型在C++中先验未知
- 具有虚拟析构函数的基类子类中的默认析构函数
- 使用默认构造函数的父类;子类的析构函数意外调用
- Qt c++ 类 + 子类使用 Q_OBJECT 不起作用
- 提升 Python 包装的虚拟类 - 子类返回错误:与C++签名不匹配
- 宠物动物园C++/继承类/子类
- 模板基类子类的模板专用化
- 在c++中,如何确定一个类是否是继承链中的最后一个类/子类?它位于基类的另一端
- 如何使用模板类的模板类子类从哈希表实现哈希集