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

Can pointers to child objects be treated like pointers to parent objects?

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

对于您的情况,C++ 允许 covariant return types。这意味着您不仅可以从继承的方法 return 派生 class 类型,还可以将继承的函数声明为 return 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);

当只为基 class 分配了足够的内存时,就会发生切片,因为编译器通过其参数声明使用节点参数的类型信息(编译器仅为 Node 分配足够的内存,而不是 SpecialNode)。如果声明了以下内容

class Node {
private:
    int x;
};

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

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