C++:为什么struct\class需要一个虚方法才能变成多态?

Jon*_*han 14 c++ polymorphism virtual-functions

这个问题之后,我想知道为什么C++中的struct\class必须有一个虚方法才能变成多态.

强制虚拟析构函数是有道理的,但如果根本没有析构函数,为什么要使用虚方法呢?

Ore*_*ost 21

因为C++中多态对象的类型基本上是从指向其vtable的指针确定的,vtable是虚函数表.但是,只有在至少有一个虚拟方法时才会创建vtable.为什么?因为在C++中,你永远不会得到你没有明确要求的东西.他们称之为"你不需要支付你不需要的东西".不需要多态?你刚刚保存了一个vtable.

  • @Nawaz,您可能不需要 vtable,但您仍然需要某种方法来识别该类。这意味着向其中添加一些额外的字段。因此,您仍然需要区分带有“virtual”的类和没有“virtual”的类。因此,为了迂腐,将答案中的 *vtable* 替换为 *compiler-defined-virtual-identity-system*。;) (2认同)

Kon*_*lph 8

强制虚拟析构函数是有道理的

究竟.要delete通过其基类手动(通过)破坏虚拟类,您需要一个虚拟析构函数.(现在,正如我在评论中提醒的那样,通常不需要这样做:而不是使用手动内存管理,人们会依赖现代智能指针,这些指针也可以与非虚拟析构函数一起正常工作.)

因此,任何充当多态基类的类通常都需要虚拟析构函数或虚函数.

并且由于运行时多态性会增加开销(类需要存储一个指向其虚方法表的附加指针),默认情况下不会添加它,除非必要,否则:C++的设计理念是"你只需支付所需的费用" .使每个类都有一个虚拟方法表会违反这个原则.

  • 我不能同意.如果你想破坏*多态*,你只需要一个虚拟析构函数,规则是你应该提供一个*public virtual destructor或一个受保护的非虚拟析构函数*,其中第二个选项允许你创建和删除非对象多态但在它们活着时以多态方式使用它们.事实上,只有虚拟方法是析构函数的类只能用于*多态*来进行破坏. (5认同)