Effective C++ ——为多态基类声明虚析构函数

1.多态基类需要声明一个virtual 析构函数
2.不作为基类的类则不需要声明virtual 析构函数,否则是个馊主意,因为虚函数会增加类的体积.有一个心得是当一个类至少含有一个virtual 函数时,需将析构函数声明为virtual。
3.当一个类不含有virtual析构函数时,被用来当基类时会导致子类析构函数没有被调用,内存泄露风险。如:string 类,stl 容器类等都是不含有virtual析构函数的类。
下面的例子有两个功能:一、说明vptr指针的存在 二、基类析构函数有无virtual关键字区别很大,关系到子类的析构函数能不能被调用

#include 

using std::cout;
using std::cin;
using std::endl;

class Animal
{
public:
    Animal()
    {
        cout << "Animal---构造函数" << endl;
    }
    virtual ~Animal()
    {
        cout << "Animal---析构函数" << endl;
    }

};
class Tiger :public Animal
{
public:
    Tiger()
    {
        cout << "Tiger---构造函数" << endl;
    }
    ~Tiger()
    {
        cout << "Tiger---析构函数" << endl;
    }
};
int main()
{
    cout << sizeof(Animal) << endl;//4,没有virtual 则为1    
    Animal *tiger = new Tiger();
    delete tiger;//父类Animal 析构函数 没有virtual 关键字修饰,则delete tiger时不会调用子类的析构函数,会导致子类的内存没有释放,内存泄露
    cin.get();
    return 0;
}

4.纯虚函数可以使得类变为抽象类,作为基类。
当没有其他纯虚函数时,将析构函数声明为纯虚函数是个不错的主意。这样的类既可以作为基类,又不用担心子类的析构函数不被调用而导致的内存泄露问题。
注意:由于抽象类被继承后,子类的析构函数会调用抽象类的析构函数,这时由于纯虚函数是没有定义的,必然会导致连接错误,解决方案是给抽象类的纯虚析构函数一个空的实现体。

你可能感兴趣的:(Effective,C++)