个人对继承理解以及虚析构函数的理解
2012-02-26 20:47
197 查看
今天又从新研究了下继承和重载,感觉又有新的体会。
首先是对继承的理解,继承简单的说就是把基类的东西保留下来(一般都是public继承,这样基类中的public成员继承过来后还是public,基类中的protected成员继承过来后为protected,private成员派生类也无法访问)。这样就达到了代码复用的效果,派生类继承了基类的各个成员及方法。对于派生类来说,如果需要新的成员或者方法,可以在类中添加新的成员和方法,但要注意新添加的成员要进行初始化。
对于一个继承类定义对象。首先是先自动调用的是基类的默认构造函数(如果在派生类中手动调用基类的构造函数如:C::C(int a, int b):B(a), m1(b) ,则不去调用默认的构造函数而是其他构造函数在这里是B(a)),接着系统会调用派生类的构造函数,这样就产生了继承类的对象。
对于程序来说,程序结束的时候析构很重要,如果析构无法正常完成,将造成大量的资源浪费。然而对于继承来说,析构又是一个什么样的过程呢?通过实验,我发现,派生类对象的析构首先调用派生类析构函数,接着调用基类析构函数。
我是这样理解的。
对于调用析构函数先后问题:程序的运行是将每句指令调入内存中,以压栈的方式存入栈中,对于先声明的成员必定后析构,即先入后出,比如定义了两个变量human man; student stu; 那么系统先析构stu后析构man。同理对于派生类的对象,先调用了基类的构造后调用了继承类的构造,所以在析构的时候先“弹出”继承类的析构,后“弹出”基类的析构。
除此之外,我们学习继承的时候总是要设置基类的析构函数为虚函数,这是为什么呢?对于虚函数来说具有动态链编的能力,当一个基类指针指向派生类的对象时,析构该对象,如果没有虚函数,则不会运行派生类的析构函数,而是运行基类的析构函数,另外当函数覆盖时没有定义成虚函数,则不会对调用派生类对应的函数。也就是说,当析构函数不是虚函数时,此类对象的析构无法掉要派生类的析构,则会出现内存泄露的现象。
另外多说一句:虚具有传递性
首先是对继承的理解,继承简单的说就是把基类的东西保留下来(一般都是public继承,这样基类中的public成员继承过来后还是public,基类中的protected成员继承过来后为protected,private成员派生类也无法访问)。这样就达到了代码复用的效果,派生类继承了基类的各个成员及方法。对于派生类来说,如果需要新的成员或者方法,可以在类中添加新的成员和方法,但要注意新添加的成员要进行初始化。
对于一个继承类定义对象。首先是先自动调用的是基类的默认构造函数(如果在派生类中手动调用基类的构造函数如:C::C(int a, int b):B(a), m1(b) ,则不去调用默认的构造函数而是其他构造函数在这里是B(a)),接着系统会调用派生类的构造函数,这样就产生了继承类的对象。
对于程序来说,程序结束的时候析构很重要,如果析构无法正常完成,将造成大量的资源浪费。然而对于继承来说,析构又是一个什么样的过程呢?通过实验,我发现,派生类对象的析构首先调用派生类析构函数,接着调用基类析构函数。
我是这样理解的。
对于调用析构函数先后问题:程序的运行是将每句指令调入内存中,以压栈的方式存入栈中,对于先声明的成员必定后析构,即先入后出,比如定义了两个变量human man; student stu; 那么系统先析构stu后析构man。同理对于派生类的对象,先调用了基类的构造后调用了继承类的构造,所以在析构的时候先“弹出”继承类的析构,后“弹出”基类的析构。
除此之外,我们学习继承的时候总是要设置基类的析构函数为虚函数,这是为什么呢?对于虚函数来说具有动态链编的能力,当一个基类指针指向派生类的对象时,析构该对象,如果没有虚函数,则不会运行派生类的析构函数,而是运行基类的析构函数,另外当函数覆盖时没有定义成虚函数,则不会对调用派生类对应的函数。也就是说,当析构函数不是虚函数时,此类对象的析构无法掉要派生类的析构,则会出现内存泄露的现象。
另外多说一句:虚具有传递性
相关文章推荐
- 个人对继承理解以及虚析构函数的理解
- 对继承理解以及虚析构函数的理解
- 个人对封装,继承以及抽象类和接口的小理解
- 【个人笔记】用RMAN恢复控制文件以及相关操作步骤的个人理解
- javascript中继承(二)-----借用构造函数继承的个人理解
- 深入浅出理解Javascript原型概念以及继承机制
- Struts2 执行流程 以及 Action与Servlet比较 (个人理解)
- jQuery的before()方法的超简易版,用于个人理解源码以及回调函数
- 数据库的事物隔离级别以及锁的一些个人理解
- hadoop以及相关组件介绍以及个人理解
- python 编写web框架中的url处理函数以及个人理解
- 个人理解的VueJS生命周期以及其中钩子函数的实际应用
- javascript中继承(二)-----借用构造函数继承的个人理解
- C++学习之成员函数的访问属性与继承属性对虚表构建的影响--个人理解
- 对于rpc遇到的疑问以及个人理解
- vue router结合文档以及个人理解
- HBase 简介以及个人理解(原理,基本概念,基本架构)
- 深入浅出理解Javascript原型概念以及继承机制(转)
- 关于prototype以及继承方面的理解
- C++继承中析构函数 构造函数的调用顺序以及虚析构函数