虚函数的作用:假如有类A类A派生出类B
那么如果写A p = new B;时就得到了一个指向类B的指针,这个指针的类型是A
如果类A和类B中都有void Out()这么个函数p->Out()将调用A::Out()函数
而如果把类A中的改成虚函数virtual void Out()p->Out()就将调用B::Out()函数
就是这样
下面抄几段:
析构函数是“反向”的构造函数。它们在对象被撤消(回收)时调用。析构函数的名 称除了最前面的“~”符号外,与类的名称相同。例如,类String的析构函数是~string()。 析构函数通常用于当一个对象不再需要时,完成“消除”功能。
在函数中建立对象之后,这个对象作为局部对象开始生存,直到函数运行到遇见右括号“}”才结束生存,此时调用析构函数。
对象的释放发生在以下几种情况,首发自学编程网:
·使用运算符new分配的对象被delete删除。
·一个具有块作用域的本地(自动)对象超出其作用域。
·临时对象的生存期结束。
·程序结束运行。
·使用完全限定名显示调用对象的析构函数。
有几条规则约束着析构函数的说明:
·不能接受参量。
· 不能说明有任何返回类型(包括void)。
·不能用return语句返回值。
· 不能说明为const、volatile或static,但析构函数可以因说明为const、volatile或static的对象的析构而被调用。
·可以说明为虚拟的。使用虚析构函数,可以撤消对象而不必知道该对象的类型。由于使用虚拟函数机制,程序将调用该对象的正确的析构函数。
注意:在一个抽象类中,析构函数可以说明为虚函数。我们会在后面详细介绍虚函数的概念。
虚函数去这看吧
>首先,不管是默认析构函数还是自定义析构函数,它永远不应该也不允许被你调用,它是由系统调用的。如果一个类不含有指针类型的数据成员(并且这个指针是在类的构造函数里分配的内存空间)的话,可以无视析构函数。但如果类是下面这种样子的话,就应该自定义析构函数:
class A
{
public:
A() { p = new int[10]; }
~A() { delete [] p; } // 自定义析构函数
private:
int p;
};
这种情况下不重写析构函数,程序也可能正常运行,但它却造成了内存泄露这是程序员的大忌!
当类的实例对象超过了它的生存周期的时候,系统就会调用该类的析构函数来释放内存空间只能定义一个析构函数,多了的话编译器不知道调用哪个
1、虚析构函数和析构函数在功能上是一回事,因此除了动态联编(此处意思:需要销毁
父类指针指向的子类对象的空间)外,其他性质和析构函数类似。
2、析构函数与构造函数名字相同,但它前面必须加一个波浪号(~);
3、析构函数没有参数,也没有返回值,而且不能重载,因此在一个类中只能有一个析构函数;当撤消对象时,编译系统会自动地调用析构函数。构造函数是在定义类对象时有程序自动调用的为类提供初始化 *** 作的函数,其函数名和类名相同,无返回值。析构函数则做的事相反工作,主要是对类进行清理 *** 作,当然你也可以在析构函数中做其他你想做的事情。通常析构函数是释放在构造函数中申请的内存。在构造函数前加~就可以构成析构函数,同样没有返回值,值得注意的是,析构函数最后定义为虚析构函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)