C++类继承--基类析构函数加上Virtual
下面的内容要说明两个问题:1. 基类的析构函数为什么要加上Virtual--防止内存泄露
1. 基类虚构函数无virtual,派生类无法析构,会导致内存泄露
#include <stdio.h> class Base
{
public:
int a;
Base(){
a=0;
}
~Base(){
printf("base delete");
}
virtual void setA()=0;
}; class A:public Base
{
public:
A(){
a = 10;
}
~A(){
printf("A class delete\n");
}
virtual void setA()
{
a = 2;
}
}; class B:public Base
{
public:
B(){
a=20;
}
~B(){
a=-20;
} virtual void setA()
{
a = 3;
}
}; int main()
{ Base *ax = new A();
Base *bx = new B();
Base *aClass = ax;
Base *bClass = bx;
printf("a value of a construct %d\n", aClass->a);
printf("a value of b construct %d\n", bClass->a); aClass->setA();
bClass->setA();
printf("a value of a %d\n", aClass->a);
printf("a value of b %d\n", bClass->a); delete aClass; return 0;
}
运行结果为:

2. 若在基类析构函数前加上Virtual
class Base
{
public:
int a;
Base(){
a=0;
}
virtual ~Base(){
printf("base delete");
}
virtual void setA()=0; };
运行结果为:

C++类继承--基类析构函数加上Virtual的更多相关文章
- 关于Java抽象类,接口与实现接口及派生类继承基类
1. 抽象类 抽象类就是有一个或多个方法只被声明而未被实现. 抽象方法的声明以分号结束,并且用关键字abstract来说明它以标识它为抽象方法. 格式: public abstract class 类 ...
- C++类继承--基类new和用派生类new的区别
实际上无论是用基类还是派生类New, 结果是一样的: #include <stdio.h> class Base { public: int a; Base(){ a=0; } virtu ...
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
一.不能自动继承的成员函数 构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类 ...
- Delphi 继承基类的窗体,并显示基类的控件操作。
1. 先建一个普通的窗体,until1 2. 先把类实现基类, 并需要实现基类需要继承的方法, 可以先不用再方法中写实现代码. TForm4 = class(TfrmmtAReportPeriod ...
- C# 派生和继承(派生类与基类)
using System; using System.Collections.Generic; using System.Text; namespace 继承 { class Program { st ...
- C++——类继承以及类初始化顺序
对于类以及类继承, 几个主要的问题:1) 继承方式: public/protected/private继承. 这是c++搞的, 实际上继承方式是一种允许子类控制的思想. 子类通过public继承, 可 ...
- c++——派生类和基类转换(类型兼容性原则)
基类也叫父类,派生类也叫子类. 类之间的继承关系继承关系是类之间的父子关系. 继承关系的特点如下:A. 子类拥有父类的所有属性和行为B. 子类也是一种特殊的父类C. 子类对象可以当父类对象使用D. 子 ...
- C++_派生类的构造函数及派生类和基类之间的特殊关系
派生类和基类的概念及派生类构造函数的原理: 创建一个叫做TableTennisPlayer的基类,记录会员的名字和是否有球桌. //声明一个基类 class TableTennisPlayer { p ...
- Java如何解决脆弱基类(基类被冻结)问题
概述 大多数好的设计者象躲避瘟疫一样来避免使用实现继承(extends 关系).实际上80%的代码应该完全用interfaces写,而不是通过extends.“JAVA设计模式”一书详细阐述了怎样用 ...
随机推荐
- day0203 (whil else)
count = 0while count <= 5 : count += 1 if count == 3:break print("Loop",count) else: pr ...
- docker 安装sentry
主页:https://sentry.io/welcome/ 环境安装 请先安装 Docker 1.10+ ,使用 CE 版本:安装文档,写的很清晰,不详述:因为国内网络环境问题,一般建议 docker ...
- 线性代数与simplex
线性方程组: \(i:1-n\) \(j:1-m\) \({\begin{cases}a_{11}x_1+a_{12}x_2+a_{13}x_3+\cdots+a_{1n}x_n=b_1\\a_{21 ...
- 换个角度看Salesforce之基础配置学习笔记(二)
1. 登录后无法使用Developer Console? 先找到当前登录用户的Profie,然后勾选Profile中的View All Data(Modify All Data)即可: 2. Pers ...
- 浅解bootstrap 下拉框插件
最近的业务需求是把后台数据渲染到前端,其中有一个是复选框数组,前端选择渲染的方式是bootstrap的下拉插件 渲染完成之后,此时会在原有select同级上面生成buton,dropdown-menu ...
- Linux~win10上开启ubuntu子系统
在进行win10之后,我们可以在它上面安装一个linux子系统,然后就可以使用linux了,你不需要安装虚拟机,也不需要安装双系统! 1 通过Win10任务栏中的Cortana搜索框搜索打开“启用或关 ...
- window server 搭建git服务器
Git服务器Gogs简易安装-Windows环境 1.下载git for windows 1 https://github.com/git-for-windows/git/releases/dow ...
- NMAP - A Stealth Port Scanner--reference
http://nmap.org/bennieston-tutorial/ 实例:nmap -sP 192.168.21.* Contents 1 Introduction Nmap is a fre ...
- java.net.SocketException四大异常解决方案---转
java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketExceptio ...
- ng-value中格式化日期
ng-value="conferenceinfo.create_time | date:'yyyy-MM-dd'"