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

时间:2015-11-08 02:56:17

标签: c++ pointers inheritance binary-search-tree nodes

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

1 个答案:

答案 0 :(得分:1)

特别针对您的情况,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