gpt4 book ai didi

c++ - 可以将指向子对象的指针视为指向父对象的指针吗?

转载 作者:行者123 更新时间:2023-11-28 05:59:17 25 4
gpt4 key购买 nike

我正在使用提供给我的接口(interface)类型类构建二叉搜索树。我有一个由纯虚函数组成的 BSTInterface 类。它由 BST.h 继承,BST.h 由 BST.cpp 实现。 BSTInterface 指定了一个名为 getRootNode() 的函数,该函数返回一个 NodeInterface* 我的 NodeInterface.h 是一个由纯虚函数组成的类,它由 Node.h 继承,由 Node.cpp 实现。在我的 BST::getRootNode() 函数中,我可以返回一个 Node*,还是必须返回一个 NodeInterface*?如果我必须返回一个 NodeInterface*,我可以简单地设置一个 NodeInterface*=Node* 吗?任何帮助理解父对象和子对象之间的关系的帮助将不胜感激。非常感谢!

最佳答案

特定于您的情况,C++ 允许 covariant return types .这意味着您不仅可以从继承方法返回派生类类型,还可以声明继承函数以返回派生类型:

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 分配足够的内存,而不是 特殊节点)。如果声明了以下内容

class Node {
private:
int x;
};

class SpecialNode : public Node {
private:
int y;
};

“y”数据成员不会出现在传递给 someFunction 的节点中,因为它已被“切片”。请注意,这仅发生在按值传递参数中,而不是按引用传递或按指针传递。有关详细信息,请参阅 object slicing .

关于c++ - 可以将指向子对象的指针视为指向父对象的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33590235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com