c++虚方法:必须在父类中为父类和子类不共享的每个方法创建一个虚方法吗?

C++ Virtual Methods: Must I create a virtual method in the parent class for every method that the child and parent do not share?

本文关键字:方法 父类 创建 一个 子类 c++ 共享      更新时间:2023-10-16

我有几个多边形类型的对象,它们只是定义形状,我想将它们存储在一个包含多边形的向量中。Polygon有几个通用的方法,如getArea()等,但它是一个纯粹的抽象类。

如果我有一个名为Circle的Polygon的孩子,使用getRadius()方法,我是否需要在Polygon中创建一个虚拟方法来访问该方法,如果它存储在矢量中?

如果我扩展到越来越多的形状,在多边形声明中创建所有这些虚拟方法(在子声明中关联子方法)不是多余的和浪费空间吗?

是否有另一种方法来通知编译器,我在可用的子方法的多边形向量中创建的对象(子类型),而不使用虚拟方法?或者这就是虚拟方法的全部意义?

我理解如何使用子节点和父节点共享的虚拟方法,我只是在父节点没有我想从子节点访问的方法的情况下询问。

虚方法的意义在于允许由不同子方法以不同方式实现的方法在运行时以正确的实现被调用。

如果你有一个方法只特定于一个子类,那么父类不应该有它的虚方法。

如果你试图调用特定于Circle的方法,那么你应该使用Circle*而不是Polygon*

如果非共享方法对父类没有意义,那么您根本不希望将其放在父类中。事实上,在这种情况下,多态性并不适用,因为您不能让不同的运行时实例在该方法上表现不同:该方法对某些子类的实例没有意义,而对其他一些子类则有意义。因此,您可能想要创建一个新类,它(1)将成为前面提到的父类的子类,(2)将具有在其他类之间共享的虚拟方法,(3)将由这些类扩展。

一般来说,如果您想调用特定于特定类的方法,则需要将对象强制转换为该类或其声明该方法的祖先之一(无论是否为虚的)。

我假设你想让一个单独的getRadius调用向量,它将分别调用单独的多边形。那么基类显然是有意义的。

只需为所有子类实现单独的GetRadius方法,并具有一个默认的虚函数以确保一致性。

既然,你说,有多个形状,这意味着有多个类,也就是多个GetRadius实现。

虚函数将简化调用过程。