c++的虚析构函数和纯虚析构函数

虚函数是用作实现子类的多态性的,它可以在运行的过程中选择子类或者父类的同名函数,意思就是说,每次只有一个函数运行。

但是对于析构函数来说,子类 与父类在销毁对象时,都应该要调用 ,所以把父类的析构函数定义为虚函数,会发生什么事情呢。

class

{

public:

   A(){cout<<"A constructor"<

   virtual ~A(){count<<"A delete"<

};


class B:public A

{

public B(){cout<<"B constructor"<

public ~B(){cout<<"B delete"<

};


int main()

{

       A *p = new B();

      return 0;

}


可以发现,A 和 B都调用了析构函数,这时如果把A类的virtual 去掉,那么就不会调用B的析构函数了。

为什么呢?因为父类只能调用子类中继承父类的方法,而如果需要父类调用以属于子类实现的方法,那么只有把父类中同名的方法设置成虚函数,所以把父类的析构函数设置为虚函数,父类才能调用子类的析构函数。

所以把基类的析构函数写为虚函数与其它成员函数写作虚函数是不一样的。

还有一个问题就是为什么不能把构造函数设置成虚函数?

1.因为虚函数是用来实现多态,如果把基类的构造函数设置成虚函数后,那么在构造父类的时候 ,就不得不显示调用父类的构造函数了,与多态相矛盾了

2.虚函数在继承了父类并且对象都构造完后,在运行过程中实现动态绑定的,而在构造函数中,对象还没有完全构造完,所以实现不了动态的绑定技术 ,实现不了多态。






当一个类中包含一个纯虚函数时,这个类为抽象类,它是不能有实例对象的,如A是一个抽象类,那么不能使用 A a ;


总结:如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,就不要定义虚析构函数了,因为它会增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移值性。

所以基本的一条是:无故的声明虚析构函数和永远不去声明一样是错误的。

当且仅当类里包含至少一个虚函数的时候,才去声明虚析构函数。

抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以在想要成为抽象类的类里声明一个纯虚析构函数。

 

定义一个函数为虚函数,不代表该函数未被实现,只是为了来实现多态。

定义一个函数为纯虚函数,才表示函数未被实现 ,定义它是为了实现一个接口,起一个规范作用。继承抽象类的派生类要实现这个函数…



你可能感兴趣的:(c/c++)