c++ - 为什么我们需要父类(super class)的指针指向子类的对象?

标签 c++

我现在正在学习 C++,并且阅读了很多关于使用父类(super class)的指针指向子类的对象的资料,尤其是在(纯)虚类的情况下。由于我没有太多经验,谁能帮助我理解为什么我们需要这样做?非常感谢!

最佳答案

不需要。如果确实需要,您可以使用指向派生类型的指针。

Liskov substitution principle说我们应该总是能够在需要基类型的地方使用派生类型。这个想法是派生类型不应比其基类更具限制性。这样,派生的实际上是一个基类型,并且可以在任何使用基类型的地方使用。基类型定义接口(interface),派生类型应满足相同的接口(interface)。如果愿意,派生类型可以扩充接口(interface)。

您的函数应该采用的指针类型完全取决于您希望能够接受的内容。例如,如果您有一个包含两个 WidgetButtonList 的层次结构,那么如果您的函数很乐意采用任何类型的 Widget,它应该带一个Widget*。但是,如果函数特别需要一个 Button,则它应该采用一个 Button*。这样做的原因是该功能可能需要一些只有 Button 才能提供的功能。

当通过指针调用成员函数并且编译器发现该函数是时,编译器确保使用对象的动态类型来确定调用哪个函数。也就是说,假设您有一个 Widget* 参数,但实际上传递了一个指向 Button 对象的指针。该对象的静态类型是Widget(如果编译器只看参数类型),但它的动态类型是Button。如果你调用widget->draw(),其中draw是一个virtual函数,它会看到动态类型是Button 并确保 Button::draw 被调用。

但是,我一般不建议使用原始指针,因此如果可以的话,请首选引用 (Widget&) 或智能指针。

关于c++ - 为什么我们需要父类(super class)的指针指向子类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551548/

相关文章:

c++ - Rcpp 中用户编写的 header /命名空间中的函数声明

c++ - 从 C++ 向服务发送命令

c++ - 当我知道我插入的指针时,如何从 boost::ptr_set 中删除?

c++ - 注释 C/C++ 代码

Python 2.7.9 安装 esmre,错误为 'cl.exe',退出状态为 2

c++ - 将 'void' 作为函数参数传递

c++ - 如何检查 LLDB 是否从共享库加载了调试符号?

c++ - 检测 QlistWidget 中某行是否单击了某个项目

c++ - Boost日志不写入文件,怎么办?

c++ - std::move 两个双端队列 - 输入与输出迭代器