您的位置:首页 > 其它

个人对继承理解以及虚析构函数的理解

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。同理对于派生类的对象,先调用了基类的构造后调用了继承类的构造,所以在析构的时候先“弹出”继承类的析构,后“弹出”基类的析构。

除此之外,我们学习继承的时候总是要设置基类的析构函数为虚函数,这是为什么呢?对于虚函数来说具有动态链编的能力,当一个基类指针指向派生类的对象时,析构该对象,如果没有虚函数,则不会运行派生类的析构函数,而是运行基类的析构函数,另外当函数覆盖时没有定义成虚函数,则不会对调用派生类对应的函数。也就是说,当析构函数不是虚函数时,此类对象的析构无法掉要派生类的析构,则会出现内存泄露的现象。

另外多说一句:虚具有传递性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: