我正在使用给予我的接口类类来构建二叉搜索树。我有一个由纯虚函数组成的BSTInterface类。它正在由BST.cpp实施的BST.h继承。 BSTInterface描述了一个名为getRootNode()的函数,该函数返回一个NodeInterface * My NodeInterface.h是一个由纯虚函数组成的类,它由Node.h继承,由Node.cpp实现。在我的BST :: getRootNode()函数中,我可以返回一个Node *,还是必须返回一个NodeInterface *?如果我必须返回一个NodeInterface *,我可以简单地设置一个NodeInterface * = Node *?任何帮助理解父母和子女对象之间的关系将不胜感激。非常感谢!可以将指向子对象的指针视为指向父对象的指针吗?
回答
特别是你的情况,C++允许covariant return types。这意味着您不仅可以从继承的方法返回一个派生类类型,但你也可以声明继承函数返回devired类型:
class Node {};
class SpecialNode : public Node {};
class Base {
public:
virtual Node* getRootNode() = 0;
};
class Derived : public Base {
public:
virtual SpecialNode* getRootNode() override {
/* return a special node... */
}
};
在一般情况下,你可以派生类型的指针赋给一个指针的基类型:
Node* node = new SpecialNode();
请注意,这只适用于引用和指针。你不能做同样的没有被声明为指针或引用的对象:当有足够的内存只分配给基类出现
void someFunction (Node node) {}
SpecialNode sn;
// Causes "slicing" to occur
someFunction(sn);
切片,因为编译器通过它的参数使用的节点参数的类型信息声明(编译器只为Node
分配足够的内存,而不是SpecialNode
)。如果下面分别宣布
class Node {
private:
int x;
};
class SpecialNode : public Node {
private:
int y;
};
的“Y”数据成员将不会出现在传递给someFunction
节点,因为它已被“切片”。请注意,这只发生在传值参数中,而不是通过引用传递或传递指针。有关更多信息,请参阅object slicing。
这是超好玩!谢谢一堆。 –
很高兴帮助。作为一个方面说明,引用和指针的工作原理是指针的大小(以及通常由编译器使用指针实现的引用)在同一台机器上的大小始终相同。因此,指向基类型的指针与指向派生类型的指针的大小相同。基础对象和派生对象不能这么说:基础对象有一个整数(x),而派生对象有两个整数(x和y)。这就是指针和引用不会遭受对象分割的根本原因。 –
- 1. 设置指向对象的指针,让对象指向对方
- 2. 传递对象指针作为指向基类的指针
- 3. 获取双指针指向的对象
- 4. boost :: gil指向bgr8_view_t对象的指针
- 5. 指向对象开始的指针(C++)
- 6. 指向对象类型的指针
- 7. 解引用指向对象的指针
- 8. 指针帮助,指向对象的指针和类
- 9. 获取对象指针指向
- 10. 这是将指针指向对象的正确方法吗?
- 11. 创建一个指向抽象对象的指针向量
- 12. ,对象和指向对象的指针有什么区别?
- 13. 指向指针的指针和指向数组的指针
- 14. 指针指向指针
- 15. 搜索对象指针的向量
- 16. 创建指针对象的向量
- 17. 指向抽象类的指针数组
- 18. 向量含有矢量对象指针的最终指向同一对象
- 19. 将“指向子类的指针”附加到“指向父类的指针”的向量中
- 20. 指向Struct的指针的指针
- 21. 原始对象的C++指针和复制对象的指针
- 22. 在指针使用函数后,如何更改指针指向的对象
- 23. 如何更新对象内部的JavaScript指针以指向另一个对象?
- 24. 将指针指向无匹配NULL的指针吗?
- 25. 指向指针数组的指针是?
- 26. 什么是指向指针的指针?
- 27. 指向Char阵列指针的指针
- 28. C++ - 指向数组的指针 - 指针
- 29. 指向C++指针的指针
- 30. 指向结构指针的指针
您可以将指向派生类的指针作为指向基类的指针返回。这是多态性的基础。 –