关于this https://stackoverflow.com/questions/2592438/does-an-abstact-classes-have-a-vtable post:
对于使用 vtable 的实现,答案是:是的,通常。你
可能认为抽象类不需要 vtable,因为
派生类将有自己的 vtable,但期间需要
构造:在构造基类时,它设置
vtable指针指向它自己的vtable。后来当派生类
输入构造函数,它将使用自己的 vtable 代替。
我假设答案是正确的,但我不太明白。为什么构建时需要vtable?
因为标准是这么说的。
[类.cdtor]/4 http://eel.is/c++draft/class.cdtor#4
当虚拟函数被直接或间接调用时
构造函数或析构函数,包括在构造过程中或
销毁类的非静态数据成员,并将对象
调用适用的是正在构造的对象(称为 x)或
销毁时,调用的函数是最终的重写者
构造函数或析构函数的类,而不是在一个类中重写它
更多派生类。
理由是first构造基类,then派生的。如果在基类的构造函数中调用虚函数,则调用派生类会很糟糕,因为派生类尚未初始化。
请记住,抽象类可能具有非纯虚函数。此外,出于调试目的,最好将纯虚函数指向调试陷阱(例如 MSVC 调用_purecall() https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/purecall).
如果所有虚拟函数都是纯虚函数,则在 MSVC 中您可以省略 vtable__declspec(novtable) https://learn.microsoft.com/en-us/cpp/cpp/novtable。如果您使用大量接口类,则可以节省大量成本,因为您省略了 vfptr 初始化。但如果您不小心调用了纯虚函数,您将遇到难以调试的访问冲突。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)