可以将指向子对象的指针视为指向父对象的指针吗?
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。
我正在使用提供给我的接口类型 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。