虚析构函数与纯虚函数

虚析构函数

通过基类的指针删除派生类对象时,通常情况只调用基类的析构函数

但是,删除一个派生类对象时,应该先调用派生类的析构函数,然后调用基类的析构函数(构造时自顶向下,析构时自底向上)

这种情况会产生内存泄漏,最终导致系统应可用内存不足而崩溃

解决办法

把基类的析构函数声明为virtual,此时派生类的析构函数即使不声明为virtual也为virtual函数

在调用基类的指针删除派生类对象时,会先调用派生类的析构函数,最后调用基类的析构函数

一般方法

如果一个类定义了虚函数,那么析构函数也应该定义为虚函数

或者一个类打算作为基类使用,也应该讲析构函数定义为虚函数

纯虚函数与抽象类

包含纯虚函数的类叫抽象类,抽象类只能作为基类来派生新类使用,不能创建抽象类的对象

抽象类的指针和引用可以指向由抽象类派生出来的类的对象

class A;             //抽象类

A a;                  //错误
A *pa;              //正确
pa = new A;      //错误

在抽象类的成员函数内可以调用虚函数,但是在构造函数或析构函数内部不能调用纯虚函数。(在成员函数内调用虚函数是多态,在构造函数和析构函数中调用虚函数不是多态)

如果一个类从抽象类派生而来,当且仅当它实现了基类中所有的纯虚函数,它才能成为非抽象类。

class A {
public:
    virtual void f() = 0;
    void g() {
        this->f();    //正确,this指针一定指向一个派生类
    }
    A() {              //此处不能用f()
    }
};

class B : public A {
public:
    void f() {
        cout << "B:f()" << endl;
    }
};

int main() {
    B b;
    b.g();
    return 0;
}

原文地址:https://www.cnblogs.com/zhp-purelove/p/9949595.html

时间: 2024-10-29 19:06:43

虚析构函数与纯虚函数的相关文章

C++中的虚析构函数、纯虚析构函数详解

C++中析构函数可以为纯虚函数吗? 众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用.那么析构函数是否可以设为纯虚呢? class CBase { public: CBase() { printf("CBase()\n"); } virtual ~CBase() = 0; // 析构函数是纯虚函数 }; 答案是可以,那么这样实现的目的是什么呢?当然是避免实例化. 但因为派生类不可能来实现基类的析构函数,所以基类析构函数虽然

构造函数、析构函数、虚析构函数、纯虚析构函数要点总结

1.派生类的构造函数.析构函数默认会调用基类的构造函数.析构函数. 顺序:基类构造.派生类构造:派生类析构,基类析构. 举例: 1 /****************************************************************************************************** 2 * File:Constructor&DestructorTest 3 * Introduction:测试构造函数.析构函数.虚构造函数与纯虚构造函数的一些

虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)

from:http://blog.csdn.net/fisher_jiang/article/details/2477577 一. 虚析构函数 我们知道,为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数.因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数. 如: class Base{public:   Base(){}   virtual ~Base(){}};class Derived: public Base{public:   D

虚析构和纯虚析构

虚析构和纯虚析构的共性 1.可以解决父类指针释放子类对象 2.都需要具体的函数实现 虚析构和纯虚析构的区别 如果是纯虚析构,则该类属于抽象类,无法实例化对象 虚析构语法 virtual ~类名(){} 纯虚析构 virtual ~类名() = 0 纯虚析构的类外实现 类名::~类名(){} 1 #include<bits/stdc++.h> 2 #include<iostream> 3 using namespace std; 4 5 class Animal 6 { 7 publ

C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序

C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序 by 小威威 1.介绍 本篇博文将通过课后作业的(15 C++ Homework) D&A 5 Collection with Inheritance来讲解一些重要的排序与零散的知识.而且,本人以科学严谨的态度,对抽象类中析构函数的调用情况进行了分类讨论并一一试验,最终得出了"抽象类最好要定义纯虚析构函数"的结论,并不是凭空捏造,或者是从网上拷贝而来.但是,这仍然代表本人观点,不具有权威性,如有错误,欢迎大家批评指

为什么必须提供纯虚析构函数的定义

转载:http://blog.chinaunix.net/uid-25544300-id-3236826.html 部分修改,感谢博主! 在 某些类里声明纯虚析构函数很方便.纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象).有些时候,你想使一个类成为抽象类,但刚好又没有 任何纯虚函数.怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明 一个纯虚析构函数. class awov { public: vi

C++ 虚函数与纯虚函数 浅析

[摘要] 本文首先简述虚函数与纯虚函数的定义,然后分析比较两者的区别与联系(DWS). [正文] 1)虚函数与纯虚函数有什么区别? 虚函数,不代表函数为不被实现的函数,为了允许用基类的指针来调用子类的这个函数:允许被其子类重新定义的成员函数. 纯虚函数,才代表函数没有被实现,为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数. 2)虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的.

C++虚析构函数

在类中,构造函数用于初始化对象及相关操作,构造函数是不能声明为虚函数的,因为在执行构造函数前对象尚未完成创建,虚函数表尚不存在,此时就无法去查询虚函数表,因此也就无法得知该调用哪一个构造函数了. 析构函数则用于销毁对象时完成相应的资源释放工作,析构函数可以被声明为虚函数.我们先通过一个例子来说明析构函数声明为虚函数的必要性. 例1: #include<iostream>using namespace std; class base{public: base(); ~base();private

C++纯虚类小览

一.文章来由 virtual 方法和 virtual 类可以说是c++语言的一大特性,甚至有人说是c++语言的精髓,其实这么说也是有一定道理的,因为运行时多态在c++中体现淋漓尽致,而 virtual 就是为多态服务的.这也是一个一定要搞懂的c++问题,所以有了这篇文章.同时,我觉得这类底层问题不可能一文以蔽之,而且我也相信真正想搞懂这个问题的读者,不会只读我这一篇文章,所以只是小览,同时欢迎讨论和指正. 二.引入原因 其实,引入纯虚函数的原因我在我另一篇文章虚函数与多态小览就有写,不过重要的话