Loa*_*oay 5 c++ constructor abstract-class pure-virtual vtable
关于这篇文章:
对于使用vtable的实现,答案是:通常是.您可能认为抽象类不需要vtable,因为派生类将具有自己的vtable,但在 构造 期间需要它:在构造基类时,它将vtable指针设置为其自己的vtable.稍后当输入派生类 构造函数时,它将使用自己的vtable代替.
我假设答案是正确的,但我不太明白.为什么vtable需要完全用于施工?
das*_*ndy -1
当你的类有一个纯虚函数时,这并不意味着你不能有它的实现(!!)。这意味着您可以拥有一个抽象类,它也是完全实现的。抽象类的构造函数必须能够调用迄今为止存在的所有函数,甚至是纯虚拟函数。
如果您替换了客户端构造函数,则根据派生类,您将获得基类构造函数的不同行为 - 这不是一个好主意,因此这是不允许的。您可以不放置任何 vtable 并静态解析所有函数调用 - 这是可行的,但它意味着与所有其他函数相比要专门处理构造函数,并且需要内联所有其他函数来执行此操作(因为从构造函数调用的函数也可能调用虚拟等) - 不太实用。
所以它只是实现了一个vtable,供构造函数和析构函数在构造和销毁期间使用。它允许您在 c'tor 和 d'tor 中使用 typeid 和dynamic_cast 并获得可预测的结果,并从您拥有的虚拟函数中获得可靠的行为。没有其他解决方案可以做到这一点。