我为具有节点的基本二进制树编写了一个函数:
struct node{
int key;
node* left;
node* right;
};
现在,对于另一个类,我想在此节点中添加指向前任和后继的指针。我希望能够将这个新结构作为节点传递给基本二进制树函数。据我所知,从在线看,派生的结构不能代替它的超级。所以,如果我这样做了:
struct fancyNode : public node{
fancyNode* pred;
fancyNode* succ;
};
这不太有用。
我的下一个想法是只使用一个带有指向旧节点结构的指针的新结构:
struct fancyNode{
node* oldNode;
fancyNode* pred;
fancyNode* succ;
};
现在这可以工作,但是我必须将oldNode元素传递给函数,而不是简单地传递整个fancyNode。
我还有另一种更容易丢失的方法,或者这是解决这个问题的唯一方法吗?
答案 0 :(得分:1)
按值传递与按推荐传递
通过在线查看,无法传递派生结构 超级的地方。所以,(...)不会很有效。
如果您打算按值传递对象,则此语句是正确的。然后可能会出现Slicing,因此您将丢失派生对象的其他数据。
但是,您当然可以将指针或引用传递给派生而不是指针或对基础对象的引用。
<强>多态性强>
如果你使用旧的C语言结构,只是为了定义一些你将被某些全局函数操作的数据结构,你就不会受益于C ++的面向对象。
您不应该考虑数据结构,而应考虑对象,即数据和通常对此数据执行的操作。如果以这种方式开始设计代码,则可以使一些操作具有多态性(使用虚函数)。这样不仅可以通过指针或引用传递基础和派生对象,还可以调用基本操作,而不必担心它是基础对象还是派生对象。