Effective C++ 条款 —— 为多态基类声明virtual析构函数

  • C++明确指出,当派生类对象经由一个基类指针被删除,而该基类带着一个non-virtual析构函数,其结果未定义——结果通常是只有对象的基类成分被销毁,而对象的派生类成分没被销毁

  • 解决办法:给基类定义一个virtual析构函数,此后删除派生类对象时就会如你所想的那般销毁整个对象。

  • 经验:任何 class 只要带有virtual函数(多态)都几乎可以确定应该也有一个virtual析构函数。

  • 当class不企图被当作base class时,令其析构函数为virtual往往是个馊主意!

    • 每一个带有virtual函数的class有一个相应的vtbl(虚函数表),它是一个由函数指针构成的数组。当对象调用某一个virtual函数时,实际被调用的函数取决于该对象的vptr(virtual table pointer)所指的那个vtbl——编译器在其中寻找适当的函数指针。

      vtbl属class所有,vptr属对象所有。即基类有它自己的vtbl,派生类也有它自己的vtbl,而一个对象如果它是基类对象,那么它的vptr指向基类的vtbl,如果是派生类对象,则其vptr指向派生类的vtbl,该对象调用虚函数时,会根据其vptr实际指向的那个vtbl,调用相应的函数。

    • 如上所言,如果class内含virtual函数,其对象的体积会增加,因为该对象还有一个vptr,增加的大小也是指针的大小。

  • 有时你希望拥有抽象类,但手上没有任何pure virtual函数,可以将该class的析构函数声明为pure virtual,并提供其定义,必须提供定义,不然派生类析构时将无法析构基类部分。

猜你喜欢

转载自blog.csdn.net/fcku_88/article/details/88543694