c++关于虚函数的知识
1、构造和析构函数
构造函数不能为虚函数。每个对象的虚函数表指针是在构造函数中初始化的,因为构造函数没执行完,所以虚函数表指针还没初始化好,构造函数的虚函数不起作用,所以构造函数不能是虚函数。
析构函数可以为虚函数。当基类的指针指向派生类时,删除基类指针,会调用子类析构函数,再去调用基类的析构函数,防止内存泄漏。
2、虚函数和纯虚函数
虚函数 virtual int A() ;
纯虚函数 virtual int A() = 0;
虚函数是为了重载和多态的需要,在基类中有定义,在子类中可以重写也可以不重写。纯虚函数在基类中无定义,必须在子类中加以实现。在基类中将函数定义为虚函数,其作用就是在子类中可以被重写,从而达到动态多态。
3、抽象类和纯虚类
包含至少一个纯虚函数的类视为抽象类,抽象类智能作为基类来派生子类,不能声明抽象类的对象。例如定义了一个形状的基类,将计算面积的函数定义为纯虚函数,当派生了不同的形状子类后,在各自的子类中将计算面积的函数进行实现。
class shape
{
protected:
double x;
double y;
public:
virtual void area()=0;
};
class triangle: public shape
{
void area()
{
cout<<x*y*0.5<<endl;
}
};
当子类B虚继承自基类A,那么类A就成为类B的虚基类。虚基类的作用是解决多继承的时候,子类中出现的二义性问题。
当类B和类C虚继承于A,而类D多继承于类B和类C,这时类D去访问类A中的对象时,就不会出现二义性的问题。
class A
{
...
};
class B: virtual pubilc A
{
...
};