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

C++ C++;虚拟方法:我必须在父类中为子类和父类不共享的每个方法创建一个虚拟方法吗?,c++,polymorphism,C++,Polymorphism,我有几个多边形类型的对象,它们只定义形状,我想将它们存储在一个包含多边形的向量中。Polygon有几个通用方法,如getArea()等,但它是一个纯粹的抽象类 如果我有一个名为Circle的多边形的子对象,使用方法getRadius(),如果该方法存储在向量中,我是否需要在多边形中创建一个虚拟方法来访问该方法 如果我扩展到越来越多的形状,那么在多边形声明中创建所有这些虚拟方法(使用子声明中的关联子方法)难道不是多余的并且浪费空间吗 有没有其他方法可以通知编译器,我在可用子方法的多边形向量中创建的

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

如果我有一个名为Circle的多边形的子对象,使用方法getRadius(),如果该方法存储在向量中,我是否需要在多边形中创建一个虚拟方法来访问该方法

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

有没有其他方法可以通知编译器,我在可用子方法的多边形向量中创建的对象(子类型)没有使用虚拟方法?或者这就是虚拟方法的全部意义


我了解如何使用子级和父级共享的虚拟方法,我只是要求在父级没有我希望从子级访问的方法的情况下使用虚拟方法。

虚拟方法的要点是允许在运行时使用正确的实现调用由不同子级以不同方式实现的方法

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


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

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


通常,如果要调用特定于特定类的方法,需要将对象强制转换到该类或其声明该方法的祖先之一(虚拟或非虚拟)。

我想您需要对向量进行一次getRadius调用,该向量将分别调用各个多边形。那么基类显然是有意义的

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

因为,您是说,有多个形状,这意味着有多个类,也就是多个GetRadius实现


虚拟函数将简化您的调用过程。

如果父类需要共享来自潜在子类的方法,那么它应该是虚拟的。如果子类只需要使用基类中的方法,那么这个方法不需要在基类中是虚拟的。如果您发现自己想要创建一个只对一个子类有意义的虚拟方法,那么您的设计可能是错误的(即,您可能滥用了多态性).我相信比我更了解的人很快会给出答案,但在我看来,如果你有需要在圆上操作的代码,它应该只接受圆对象。如果它可以处理任何多边形,它就不应该使用特定于子类的功能。还有,“我有一个多边形的子对象叫做圆”-什么?听起来你的父类应该叫做Shape。你的命名是正确的,Oil Charlesworth。当然应该是形状。好的,我的理论是,我想创建一个包含所有多边形的向量,所有多边形都有一些共享方法,每个子类都有一些特定的方法。我应该放弃这个设计吗?我注意到我对子类中特定方法的需求正在增加。我希望能够遍历向量,检查它是哪种多边形(即圆形、矩形、三角形),并对它们应用效果。有没有更好的方法,因为我希望能够动态创建不同样式的多边形。@user3908267,一种可能性是您可以创建一个名为
applyEffects
的虚拟方法,每个子对象通过调用特定于子对象的方法来实现不同的方法。然后,当你在
向量上迭代时,你可以在每个多边形上调用
applyEffects
,对象本身就会知道要执行的正确行为。哦,好的!这是个好主意。是的,我真的不认为在父对象中挂起一堆虚拟方法在任何方面都是一件好事。非常感谢,我只是在刷新自己关于面向对象编程的知识。我整天都在汇编程序,所以我有点生疏了。@user3908267,不用担心。我很高兴你发现这次讨论很有用。:)非常感谢。我同意我确实没有正确使用多态性。谢谢你的来信。