每个类在C ++中都有虚函数表吗?
我知道虚拟表是用于多态的。具有虚函数的类必须具有v-table。但是类没有虚函数呢?或者类没有基类怎么样?
答案 0 :(得分:6)
C ++的语言规范没有定义“vtable”是什么,或者哪些类需要一个。
编译器中C ++的特定实现通常使用vtable来实现虚方法。如果一个类没有虚方法(并且没有带虚方法的超类),那么编译器可能会省略vtable。但是,请记住,这纯粹是编译器实现决策,而不是标准所要求的。
答案 1 :(得分:3)
作为非标准的经验法则(vtable不受标准规定),几乎适用于所有编译器:
只有具有虚拟成员函数和/或虚拟析构函数的类才具有vtable。其他课程没有。这符合C ++中的一般规则“为你使用的东西付费”。
当然,这会让您承担一项重要责任:您的班级是否会被多态删除?即,它是否会被用作公共基类并通过它删除?然后将析构函数设为虚拟。
答案 2 :(得分:2)
C ++语言本身并没有讨论如何实现虚拟功能,即它可以使用vtable或任何其他机制。话虽如此,通常使用v-table实现,只有当类包含虚函数时才会创建此v表。
答案 3 :(得分:1)
v-table包含函数的地址。该表将保存基类中定义的所有虚函数的函数地址。 根据实际的对象类型,该地址会发生变化,并且会调用确切的函数。
如果类没有继承任何具有虚函数的类,则不需要保存任何v表。所有函数调用都将链接编译时间。