【【C++ Primer 第15章】 虚析构函数

学习资料

• C++中基类的析构函数为什么要用virtual虚析构函数

虚析构函数

1. 正文

直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++中基类的析构函数应采用virtual虚析构函数。

【注意】如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针将产生歧义。

原文地址:https://www.cnblogs.com/sunbines/p/9215305.html

时间: 2024-10-10 16:07:22

【【C++ Primer 第15章】 虚析构函数的相关文章

【C++ Primer 第15章】抽象基类

抽象基类 [注意]我们也可以为纯虚函数提供定义,不过函数体必须在类的外部,也就是说,我们不能再内部为一个=0思网函数提供函数体. C++中含有(或未覆盖直接继承)纯虚函数的类是抽象基类,抽象基类负责定义接口,而后续的的其他类可以覆盖接口.我们不能直接出创建一个抽象基类的对象. C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”. C++中的纯虚函数也是一种“运行时多态”. 1 class A 2 { 3 public: 4 virtual void out1(str

c++ primer第15章这几个例子中的构造函数形式不太理解

//向基类构造函数传递实参p491 class Bulk_item : public Item_base{ public: Bulk_item(const std::string& book,double sales_price,std::size_t qty = 0,double disc_rate = 0.0): Item_base(book,sales_price),min_qty(qty),discount(disc_rate){} }; //在派生类构造函数中使用默认实参p491 cl

C++ Primer Plus 第15章 友元、异常和其他

第15章 友元.异常和其他 1.友元不仅有友元函数,还能是友元类 还可以将类中的某一个成员函数指定为另一个类的友元 尽管友元被授予从外部访问私有部门的权限,单并不与面向对象编程思想相愽,相反,它们提高了公有接口的灵活性 2.类的成员函数作为其他类的友元,涉及到类的声明顺序. 还有一个函数作为两个类的友元 这方面内容看P607-611 3.嵌套类:在另一个类中声明的类被称为嵌套类 类嵌套与包含不一样.包含意味着将一个类对象作为另一个类的成员,而对类进行嵌套不创建类成员,而是定义了一种类型. 4.对

C++ Primer学习总结 第15章 面向对象程序设计

第15章 面向对象程序设计 1.    构造基类和派生类. 其中A类是基类,B类是派生类.派生类的构造函数必须重新写过,不能继承.(因为毕竟两个类的类名都不一样,不可能构造函数继承)只继承其他的成员函数和成员变量. 派生类可以覆盖基类的虚函数,但是也可以选择不覆盖(即直接使用父类的函数版本)比例A类的print_1()虚函数就没有被覆盖. 基类的静态成员:如果基类有一个静态成员,那么基类和所有派生类都共同拥有这仅有的一个静态成员. 2.    基类的虚函数默认实参最好与派生类的虚函数默认实参一致

《C++Primer》14、15章

第14章 重载运算符与类型转换 14.1 基本概念 只有当操作的含义对于用户来说清晰明了时才使用运算符. 选择作为成员还是非成员? 赋值.下标.调用和成员访问运算符必须是成员. 复合赋值运算符一般是成员. 改变对象状态或者与给定类型密切相关的,如递增.解引用通常是成员. 具有对称性的运算符可能转换任意一端元素的运算对象,例如算数.相等.关系和位运算等,通常是非成员函数. 14.2 输入输出运算符(略) 14.3 算术与关系运算符(略) 14.4 赋值运算符(略) 14.5 下标运算符 通常会定义

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

C++ Primer 学习笔记33_面向对象编程(4)--虚函数与多态(一):多态、派生类重定义、虚函数的访问、 . 和-&gt;的区别、虚析构函数、object slicing与虚函数

C++ Primer学习笔记33_面向对象编程(4)--虚函数与多态(一):多态.派生类重定义.虚函数的访问. . 和->的区别.虚析构函数.object slicing与虚函数 一.多态 多态可以简单地概括为"一个接口,多种方法",前面讲过的重载就是一种简单的多态,一个函数名(调用接口)对应着几个不同的函数原型(方法). 更通俗的说,多态行是指同一个操作作用于不同的对象就会产生不同的响应.或者说,多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为. 多态行分

第 15 章

15.1 [出题思路] 熟悉理解虚函数.虚成员的定义. [解答] 在类中被声明为 virtual 的成员,基类希望这种成员在派生类中重定义.除了构造函数外,任意非 static 成员都可以为虚成员. 15.2 [出题思路] 区分 protected 和 private 的访问权限控制的不同之处. [解答] protected 为受保护的访问说明符.protected 成员可以被该类的成员.友元和派生类成员(非友元)访问,而不可以被该类类型的普通用户访问.而 private 成员只能被基类的成员和

第十三章 虚函数

第十三章 虚函数 1.  指向对象的指针 常用 不常用????????? 2.  虚函数 virtual  体现虚函数的 多态性(动态联编) 存储不同对象的指针调用不同类的函数 3.  拳击游戏 4.  继承是否可以实现多态性 继承无法实现多态,要想实现多态就要在基类加virtual 5.  在编译时的静态联编 6.  在运行时的静态联编 7.  在运行时的动态联编 动态联编体现了多态性 所以一定要有virtual 而且要用指针或者别名 否则不能实现 8.  在编译时的动态联编 9.  三种调用