我现在正在学习 C++,并且阅读了很多关于使用父类(super class)的指针指向子类的对象的资料,尤其是在(纯)虚类的情况下。由于我没有太多经验,谁能帮助我理解为什么我们需要这样做?非常感谢!
最佳答案
您不需要。如果确实需要,您可以使用指向派生类型的指针。
Liskov substitution principle说我们应该总是能够在需要基类型的地方使用派生类型。这个想法是派生类型不应比其基类更具限制性。这样,派生的实际上是一个基类型,并且可以在任何使用基类型的地方使用。基类型定义接口(interface),派生类型应满足相同的接口(interface)。如果愿意,派生类型可以扩充接口(interface)。
您的函数应该采用的指针类型完全取决于您希望能够接受的内容。例如,如果您有一个包含两个 Widget
、Button
和 List
的层次结构,那么如果您的函数很乐意采用任何类型的 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/