Jon*_*han 14 c++ polymorphism virtual-functions
在这个问题之后,我想知道为什么C++中的struct\class必须有一个虚方法才能变成多态.
强制虚拟析构函数是有道理的,但如果根本没有析构函数,为什么要使用虚方法呢?
Ore*_*ost 21
因为C++中多态对象的类型基本上是从指向其vtable的指针确定的,vtable是虚函数表.但是,只有在至少有一个虚拟方法时才会创建vtable.为什么?因为在C++中,你永远不会得到你没有明确要求的东西.他们称之为"你不需要支付你不需要的东西".不需要多态?你刚刚保存了一个vtable.
强制虚拟析构函数是有道理的
究竟.要delete通过其基类手动(通过)破坏虚拟类,您需要一个虚拟析构函数.(现在,正如我在评论中提醒的那样,通常不需要这样做:而不是使用手动内存管理,人们会依赖现代智能指针,这些指针也可以与非虚拟析构函数一起正常工作.)
因此,任何充当多态基类的类通常都需要虚拟析构函数或虚函数.
并且由于运行时多态性会增加开销(类需要存储一个指向其虚方法表的附加指针),默认情况下不会添加它,除非必要,否则:C++的设计理念是"你只需支付所需的费用" .使每个类都有一个虚拟方法表会违反这个原则.