2015-11-08 86 views
0

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

+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

+0

这是超好玩!谢谢一堆。 –

+0

很高兴帮助。作为一个方面说明,引用和指针的工作原理是指针的大小(以及通常由编译器使用指针实现的引用)在同一台机器上的大小始终相同。因此,指向基类型的指针与指向派生类型的指针的大小相同。基础对象和派生对象不能这么说:基础对象有一个整数(x),而派生对象有两个整数(x和y)。这就是指针和引用不会遭受对象分割的根本原因。 –